2012-09-26 29 views
2

我正在开发一个TCP服务器端应用程序,它将数据转发给客户端。在客户端断开连接后首次调用'send'时没有获得sigpipe

我面临的问题是我试图找到我的服务器端应用程序,如果我的客户端断开连接,哪些数据被发送,哪些不是。

我的研究表明,基本上有两种方式找到了这一点:

  • 1)从套接字读取和检查FIN信号回来
  • 2)等待上的SIGPIPE信号发送呼叫

第一个解决方案似乎并不可靠的我,因为我不能保证客户端不发送任何随机数据,因此就使我的试验成功,即使它不应该。

第二种解决方案的问题是,我只能在调用send之后得到X后的sigpipe,因此无法保证哪些数据真的发送,哪些不是。我在SO和其他网站上阅读过这篇文章,说sigpipe只会在第二次调用send后才会出现,如果我只通过本地主机发送和接收,但如果我真的使用网络,则可以重现该行为。

我现在的问题是,如果X是可以改变的,并且如果是的话,我可能会看到哪些参数可以改变这种行为,或者由于TCP本质而不可靠。

回答

3

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

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

相关问题