远程计算机关闭后,套接字保持连接

时间:2016-02-16 12:40:48

标签: c# .net sockets tcp .net-4.5

我已经搜索过,但没有解决我的问题。 我在我的localhost上模拟TCP网络。服务器侦听端口,客户端连接到服务器。问题是当我通过客户端关闭套接字时,Socket.Connected在服务器中仍然存在。我需要知道客户端何时断开连接。

我想当我在客户端应用程序上调用Socket.Close时,TCP FIN数据包会被发送到服务器,对吧?但似乎没有。

你能给我一个解决方案吗?

P.S。我在关闭之前已经调用了关机,但问题仍然存在。

2 个答案:

答案 0 :(得分:2)

没有基于通知的方式来了解客户端是否已断开连接。这是tcp / ip通信的本质。了解客户端是否连接的常用方法是将数据写入客户端连接。如果出现错误,您可以猜测客户端已断开连接。您可以通过查找特定异常来简化启发式方法

答案 1 :(得分:1)

虽然我没有使用C#中的套接字编程的实际经验,但Socket.Close()似乎没有发送待处理的数据,并且暗示并不发送FIN数据包。 (在我看来,这有点误导,因为Close语义似乎与调用Stream.Close() Dispose(true)的{​​{1}}不同,如果可能的话,它会尝试刷新。如果我错了,请纠正我。)

MSDN documentation州:

  

对于面向连接的协议,建议您拨打电话   在调用Close方法之前关闭。这确保了所有数据   在连接的套接字关闭之前发送和接收。

     

如果你需要在没有先打电话给Shutdown的情况下拨打关闭,你可以   确保排队等待传出传输的数据将被发送   将DontLingerSocket选项设置为false并指定非零   超时间隔。然后关闭将阻止,直到发送此数据或   直到指定的超时到期。如果将DontLinger设置为false   并指定零超时间隔,关闭释放连接   并自动丢弃传出的排队数据。