【问题标题】:Properly close a TCP socket正确关闭 TCP 套接字
【发布时间】:2012-02-10 23:30:47
【问题描述】:

“优雅地”关闭 TCP 套接字的推荐方法是什么?

我了解到,在读取()主机缓冲区中的所有剩余数据之前关闭()可能会导致远程主机出现问题(他可能会丢失已确认的接收缓冲区中的所有数据,但不会尚未被他的应用程序读取)。对吗?

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

或者我是否必须在应用程序协议级别考虑问题并使用某种隐式或显式“传输结束”信号让对方知道关闭套接字以进行读取是安全的?

【问题讨论】:

  • 伯克利插座;我正在使用 C,但我对一般概念感兴趣。

标签: sockets tcp


【解决方案1】:

1) 调用shutdown 表示不再向套接字写入任何数据。

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

3) 现在close 套接字。

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

【讨论】:

  • 好的,我会这样做的。出于好奇:我发送到远程主机的数据是否真的有可能因为我忽略接收缓冲区中的数据而丢失,而不仅仅是主机发送的数据,因为关闭失败?
  • 是的,您发送远程主机的数据可能会丢失,因为在对方读取数据之前可能会发生异常关闭。在您确信连接已关闭之前,您不想致电 close
  • 1) shutdown(sock, 1) , 2) while(read(sock, ...)=0) 3) close(sock) 是这个顺序吗?
  • 我在终止连接之前忘记阅读了。这有帮助。谢谢:)
  • @AgapitoGallartiBernat 否。使用 UDP,无需担心完全关闭连接,至少就 UDP 本身而言。
猜你喜欢
  • 2014-04-13
  • 2011-01-26
  • 2015-12-07
  • 1970-01-01
  • 2015-09-04
  • 2011-08-08
  • 2018-12-14
  • 1970-01-01
  • 2016-05-08
相关资源
最近更新 更多