【发布时间】:2021-04-08 13:51:59
【问题描述】:
如果 ESTABLISHED 套接字(从客户端通过connect() 连接后)退出,因此内核关闭所有打开的文件描述符,另一端会发生什么?如果客户端发送 FIN 并且服务器确认它(这只是半关闭状态),但服务器尝试在该套接字上read(),那么会发生什么?我可以想象两种情况:
-
套接字服务器
read()s 也已关闭。但是在服务器端没有exit(),所以没有人在那个端关闭那个套接字。所以这里我不知道服务器是如何结束的,因为它的那个套接字的结束不应该被关闭 -
socked 的服务器没有关闭,但它读取了 0 个字节。 (来自
read()的返回值只是0),其余的取决于设计人员如何处理读取的返回值。但是即使服务器端套接字没有关闭,服务器什么时候发送its FIN位?完成执行后(完成完全连接终止)?
这是从关闭的套接字(在客户端关闭)读取的服务器端语句:
while ((len = read(sockfd, buf, 256)) > 0){
...
}
在这里,它会因为read() 读取关闭sockfd 而返回吗?还是因为 read() 返回 0 从而使条件为假? (上述2种情况)。据我所知,如果read() 在关闭的 fd 上读取,则错误将返回 (-1)。但是 0 字节读取只是返回 (0)。那么返回什么?
【问题讨论】:
-
关闭一个套接字不会关闭另一个套接字。 1、接收到FIN的socket直到本地应用程序关闭后才处于关闭状态。在此之前它一直处于 CLOSE_WAIT 状态。 2.服务器在调用
shutdown()或close()时发送自己的FIN位。
标签: sockets tcp client-server