C# 远程计算机关闭插座后,插座仍保持连接状态

C# 远程计算机关闭插座后,插座仍保持连接状态,c#,.net,sockets,tcp,.net-4.5,C#,.net,Sockets,Tcp,.net 4.5,我已经搜索过了,但没有解决我的问题。 我正在本地主机上模拟TCP网络。服务器侦听端口,客户端连接到服务器。问题是,当我通过客户端关闭套接字时,socket.Connected在服务器中保持为true。我需要知道客户端何时断开连接 我想当我在客户端应用程序上调用Socket.Close时,会向服务器发送一个TCPFIN数据包,对吗?但似乎没有 你能给我一个解决办法吗 另外,我已经在关闭前调用了shutdown,但问题仍然存在。虽然我没有在C#中进行套接字编程的实际经验,但似乎socket.Clos

我已经搜索过了,但没有解决我的问题。 我正在本地主机上模拟TCP网络。服务器侦听端口,客户端连接到服务器。问题是,当我通过客户端关闭套接字时,
socket.Connected
在服务器中保持为true。我需要知道客户端何时断开连接

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

你能给我一个解决办法吗


另外,我已经在关闭前调用了shutdown,但问题仍然存在。

虽然我没有在C#中进行套接字编程的实际经验,但似乎
socket.Close()
不发送挂起的数据,也暗示着不发送FIN数据包。(我认为这有点误导,因为
Close
语义似乎与调用
Dispose(true)
Stream.Close()
不同,后者在可能的情况下尝试刷新。如果我错了,请纠正我。)

各国:

对于面向连接的协议,建议您调用 在调用Close方法之前关闭。这确保了所有数据 在关闭之前,在连接的插座上发送和接收

如果需要在不首先调用Shutdown的情况下调用Close,可以 确保排队等待传出传输的数据将由 将DontLingerSocket选项设置为false并指定非零 超时间隔。Close随后将阻塞,直到发送或删除此数据 直到指定的超时过期。如果将DontLinger设置为false 并指定零超时间隔,关闭将释放连接 并自动丢弃传出的排队数据


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

提到您应该在关闭前调用Shutdown()。这就是为什么您经常会发现格式为
Areyouthhere?
-
IAmHere
的数据包,这些数据包不做任何其他工作来检查哪些通信仍然存在。另一种检测断开连接的方法是发送/接收过程中的超时或异常。@Sinatr这种模式因Heartbleed bug而出名。但我认为这对撞车很重要,杀掉-9,或者,好吧,关闭而不冲水。哦:-)糟糕。我觉得很简单。我的印象是,“没有基于通知的方式来知道客户端是否断开连接”只适用于崩溃等情况,而不适用于定期关机(OP正在尝试执行)。参见事件序列。在有序关闭中,“基于通知的方式来了解客户端是否已断开连接”是接收由关闭其连接的伙伴发送的FIN。所以我必须假设,出于这样或那样的原因,由于这样或那样的原因,没有执行常规的双边关机。