C 第一次调用';发送';客户端断开连接后

C 第一次调用';发送';客户端断开连接后,c,tcp,C,Tcp,我正在开发一个TCP服务器端应用程序,它将数据转发给客户端 我面临的问题是,我试图在我的服务器端应用程序上找出我的客户端是否已断开连接,哪些数据已发送,哪些未发送 我的研究表明,基本上有两种方法可以找到答案: 1) 从插座读取数据,检查FIN信号是否返回 2) 正在等待发送呼叫上的信号管道信号 第一个解决方案对我来说似乎不可靠,因为我不能保证客户端不会发送任何随机数据,因此会使我的测试成功,即使它不应该成功 第二种解决方案的问题是,在调用send之后,我只在X之后得到sigpipe,因此无法

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

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

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

  • 1) 从插座读取数据,检查FIN信号是否返回
  • 2) 正在等待发送呼叫上的信号管道信号
第一个解决方案对我来说似乎不可靠,因为我不能保证客户端不会发送任何随机数据,因此会使我的测试成功,即使它不应该成功

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


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

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

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