让我来简化一下我正在处理的代码:
int fd = socket(...);
int client = accept(fd, ...);
while (true) {
int bytes_read = recv(client, ...);
if (bytes_read == 0) {
break;
}
};
此时我已经知道客户端已断开连接(recv
返回0)。但我是否仍需要调用
close(client);
?
让我来简化一下我正在处理的代码:
int fd = socket(...);
int client = accept(fd, ...);
while (true) {
int bytes_read = recv(client, ...);
if (bytes_read == 0) {
break;
}
};
此时我已经知道客户端已断开连接(recv
返回0)。但我是否仍需要调用
close(client);
?
是的。
当你通过recv()
函数接收到0字节时,这就是内核告诉你远程主机关闭了他们的连接中的发送端。他们仍然可能保持连接打开状态,可以接收你发送的更多数据(但无法回复)。
当你在TCP套接字上调用close()
函数时,你正在做两件事:
shutdown(fd, SHUT_WR)
,仍在等待服务器发送更多数据。在这种情况下,他确实需要被告知。 - Jonathon Reinhartclose()
隐含了shutdown()
。我从来没有建议调用shutdown
是必须的。 - Jonathon Reinhart您需要关闭描述符以释放绑定到其上的资源。