【发布时间】:2015-05-25 05:41:35
【问题描述】:
我无法结束 tcp 流。我正在编写一个简单的服务器和客户端,其中客户端连接到服务器,服务器显示一条欢迎消息,要求客户端输入用户名。
问题是,当服务器写入消息时,客户端的 read() 被阻塞。只有当我调用 shutdown() 时它才会被解除阻塞。
服务器:
if (FD_ISSET(tcp_listenfd, &rset)) {
len = sizeof(cliaddr);
if ((new_confd = accept(tcp_listenfd, (struct sockaddr *) &cliaddr, &len)) < 0) {
perror("accept");
exit(1);
}
/* Send connection message asking for handle */
writen(new_confd, handle_msg, strlen(handle_msg));
/* Fork here or shutdown fd is inherited */
shutdown(new_confd, SHUT_WR);
客户:
if ((connect(sock, (struct sockaddr *) server, sizeof(struct sockaddr_in))) < 0) {
perror("inet_wstream:connect");
exit(1);
}
s_welcome_msg[19] = '\0';
readn(sock, s_welcome_msg, 20); //Blocks here if shutdown() is not called in server
readn() 和 writen() 函数改编自 Stevens 的“套接字网络 API”,可在此处找到:http://www.informit.com/articles/article.aspx?p=169505&seqNum=9
如何在不调用shutdown() 且没有客户端阻止的情况下从服务器编写欢迎消息?如果需要更多上下文,我将发布更多代码。
【问题讨论】:
-
readn函数在实际读取 20 个字节之前不会返回(或者它得到 EOF,这是您通过关闭发送端引起的)。这可能不是你想要的。您需要决定客户端在看到消息结尾时如何知道。