按照 Beej 的网络编程指南实施聊天客户端
Implementing chat client following Beej's guide to network programming
我正在尝试按照 Beej's guide. I have compiled the server in section 7.2 学习网络编程,那是使用 select()
,现在我正在尝试为该服务器编写一个客户端,这样我就可以打开两个终端我的机器,可以聊天。
我从 client he gives as an example in section 6.2 开始,我可以看到如果我连接到 localhost
,服务器会接受连接,所以我从那里开始。
我所做的是在接受到服务器的连接后(在 freeaddrinfo(servinfo); // all done with this structure
之后)立即编辑这部分代码,这是我添加的代码部分。
while (1) {
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(STDIN, &readfds);
FD_SET(sockfd, &writefds);
fcntl(STDIN, F_SETFL, O_NONBLOCK);
if (select(sockfd+1, &readfds, &writefds, NULL, NULL) < 0) {
close(sockfd);
perror("client: select");
exit(1);
}
if (FD_ISSET(sockfd, &writefds)) { // got data from socket, write it to console
numbytes = recv(sockfd, buf, MAXDATASIZE, 0);
buf[numbytes] = '[=10=]';
printf("%s\n", buf);
}
if (FD_ISSET(STDIN, &readfds)) { // got data from stdin, write it to socket
fgets(buf, MAXDATASIZE, STDIN);
send(sockfd, buf, strlen(buf), 0);
}
}
在尝试 运行 这段代码时,我注意到 recv()
从来没有 returns。我知道这段代码远非完美,但这是我第一次使用套接字,所以我很想得到一些关于我在这里做错了什么的指导。
recv(2)
是读操作,所以 sockfd
应该进入 readfds
而不是 writefds
.
(STDIN
是从哪里来的?在 POSIX 系统上你可以使用 STDIN_FILENO
。)
您已经说过这是简单的测试代码(在实践中可能会按预期工作),但以防万一您没有意识到:recv()
可能会任意拆分数据。作为一个极端的例子,它可以 return 一次一个字节。
我正在尝试按照 Beej's guide. I have compiled the server in section 7.2 学习网络编程,那是使用 select()
,现在我正在尝试为该服务器编写一个客户端,这样我就可以打开两个终端我的机器,可以聊天。
我从 client he gives as an example in section 6.2 开始,我可以看到如果我连接到 localhost
,服务器会接受连接,所以我从那里开始。
我所做的是在接受到服务器的连接后(在 freeaddrinfo(servinfo); // all done with this structure
之后)立即编辑这部分代码,这是我添加的代码部分。
while (1) {
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_SET(STDIN, &readfds);
FD_SET(sockfd, &writefds);
fcntl(STDIN, F_SETFL, O_NONBLOCK);
if (select(sockfd+1, &readfds, &writefds, NULL, NULL) < 0) {
close(sockfd);
perror("client: select");
exit(1);
}
if (FD_ISSET(sockfd, &writefds)) { // got data from socket, write it to console
numbytes = recv(sockfd, buf, MAXDATASIZE, 0);
buf[numbytes] = '[=10=]';
printf("%s\n", buf);
}
if (FD_ISSET(STDIN, &readfds)) { // got data from stdin, write it to socket
fgets(buf, MAXDATASIZE, STDIN);
send(sockfd, buf, strlen(buf), 0);
}
}
在尝试 运行 这段代码时,我注意到 recv()
从来没有 returns。我知道这段代码远非完美,但这是我第一次使用套接字,所以我很想得到一些关于我在这里做错了什么的指导。
recv(2)
是读操作,所以 sockfd
应该进入 readfds
而不是 writefds
.
(STDIN
是从哪里来的?在 POSIX 系统上你可以使用 STDIN_FILENO
。)
您已经说过这是简单的测试代码(在实践中可能会按预期工作),但以防万一您没有意识到:recv()
可能会任意拆分数据。作为一个极端的例子,它可以 return 一次一个字节。