在.NET中检测客户端断开连接的最佳做法?

ced*_*rou 8 .net sockets tcp disconnect

我正在用C#开发一个服务器,它只能接受一个客户端,我需要知道这个客户端什么时候断开连接才能接受另一个连接请求.

我正在使用第一个Socket,它持续监听连接请求Socket.BeginAccept并接受或拒绝客户端.当接受客户端时,返回的新Socket Socket.EndAccept用于客户端和服务器之间的通信.然后,服务器等待来自客户端的命令Socket.Begin/EndReceive并发送响应.服务器使用类似Telnet的协议,这意味着每个命令和每行响应必须以\r\n.

为了检测客户端是否已断开连接,我安装了一个定时器,每500ms \r\n向客户端发送一条空消息(" ").如果客户端断开连接,则Socket会抛出异常.服务器捕获此异常,该服务器关闭当前会话并接受新连接.此解决方案是健壮的,但意味着网络上不需要的流量,必须由客户端正确处理,客户端必须在获得实际响应之前过滤虚拟消息.

我试图发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)),但它似乎在方向server-> client中不起作用.

另一种解决方案可能是处理Socket.EndReceive返回0字节的情况.它适用于在"空闲"时间内发生断开连接的情况.但是,如果客户端在传输消息期间断开连接,则服务器并不总是看到它并无限期地等待.

我已经看到了关于这个问题的几个线索和问题,但我从未见过任何好的解决方案.

所以我的问题是:在.Net中检测断开连接的最佳方法是什么?

Chr*_*ers 5

唯一的其他选择是,如果是TCP,则使TCP经常发送一次保持活动状态,这仍在轮询,例如您现在正在执行的操作,但是在TCP层进行了处理,因此您不需要协议知道。

但是,围绕轮询没有办法,因为如果不向其他客户端发送消息并获得响应,您将无法知道它是否仍处于连接状态。

通过状态数据包检查(例如标准NAPT)进行通信时,无论如何也可能需要保持活动状态,以避免远程服务器由于不活动而中断会话。