2

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

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

我的研究表明,基本上有两种方法可以找出答案:

  • 1) 从套接字读取并检查 FIN 信号是否返回
  • 2) 等待发送调用上的 sigpipe 信号

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

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

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

4

1 回答 1

3

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

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

于 2012-09-26T13:06:46.207 回答