正确关闭TCP套接字

17

如何“优雅地”关闭TCP套接字?

我了解到,在读取主机缓冲区中所有剩余数据之前进行close()可能会对远程主机造成问题(他可能会丢失已被确认但尚未被其应用程序读取的接收缓冲区中的所有数据)。这正确吗?

有什么好的方法可以避免这种情况吗?是否有一些方法可以告诉API我并不真正关心由于忽略任何剩余缓冲数据并关闭套接字而导致的数据丢失?

或者,我必须在应用程序协议层面考虑这个问题,并使用某种隐式或显式的“传输结束”信号来让另一方知道可以安全地关闭读取套接字吗?


伯克利套接字;我正在使用C语言,但我对一般概念感兴趣。 - lxgr
1个回答

26

1) 调用 shutdown 函数来表明你将不再向套接字中写入任何数据。

2) 持续从套接字中 read 数据,直到出现错误或连接关闭。

3) 现在,close 套接字。

如果你不这样做,可能会在还有数据需要读取时关闭连接,导致不正常的关闭。


1
是的,你发送到远程主机的数据可能会丢失,因为异常关闭可能会在另一端读取数据之前发生。在确信连接已关闭之前,不要调用 close - David Schwartz
3
  1. shutdown(sock, 1),2) while(read(sock, ...)=0),3) close(sock)。这是正确的顺序吗?
- ernesto
UDP也是一样的吗? - Agapito Gallart Bernat
1
@AgapitoGallartiBernat 不需要。对于UDP,至少就UDP本身而言,没有连接需要担心干净地关闭。 - David Schwartz
当你使用shutdown(sock, 3)关闭连接时,你还能读取其他对等方未读取的缓冲数据吗?如果不能,那么在关闭连接后立即执行close()是否会对其他对等方读取已发送给他的所有数据造成麻烦? - Palo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接