在客户端断开连接后第一次调用'send'时没有收到sigpipe

时间:2012-09-26 08:32:57

标签: c tcp

我正在开发一个TCP服务器端应用程序,它将数据转发给客户端。

我面临的问题是,我试图在我的服务器端应用程序中查找我的客户端是否断开连接以及哪些数据已发送,哪些数据未发送。

我的研究表明,基本上有两种方法可以解决这个问题:

  • 1)从插座读取并检查FIN信号是否回来
  • 2)等待发送呼叫上的sigpipe信号

第一个解决方案对我来说似乎不可靠,因为我无法保证客户端不会发送任何随机数据,因此即使它不应该也会使我的测试成功。

第二个解决方案的问题是我只是在调用send之后的X之后才得到sigpipe,因此无法保证哪些数据真正发送过,哪些数据没有。我在这里和其他网站上看到,sigpipe应该在第二次调用send之后才会出现,如果我只通过localhost发送和接收,我可以重现这种行为,但如果我真的使用网络则不能重现。

我现在的问题是,如果X可以变化是正常的,如果是,我可能会考虑哪些参数来改变这种行为,或者由于TCP性质,这是不可靠的。

1 个答案:

答案 0 :(得分:3)

TCP连接是双向的。来自客户端的FIN表示客户端不会再发送任何数据,但仍可以发送另一方向的数据(从服务器到客户端)(如果客户端没有重置与RST的连接)。从客户端检测FIN的可靠方法是从客户端套接字读取(如果使用套接字接口),直到读取返回0.

TCP保证如果两端都终止与已确认的FIN的连接,则由另一方接收在连接内交换的所有数据。如果使用RST终止连接,则TCP本身无法确定另一方成功读取了哪些数据。要做到这一点,您需要一些应用程序级别的机制,例如应用程序级别的确认。但最好的方法是以这种方式设计您的协议,在正常情况下,该连接始终优雅地关闭(来自双方的FIN,没有RST)。