我正在使用C#开发一个服务器,只能接受一个客户端连接。我需要知道何时该客户端断开连接,以便能够接受其他连接请求。
我使用第一个Socket来持续监听连接请求,并使用Socket.BeginAccept接受或拒绝客户端。当客户端被接受时,返回的新Socket用于客户端和服务器之间的通信。然后,服务器使用Socket.Begin/EndReceive等待来自客户端的命令并发送响应。服务器使用类似Telnet的协议,这意味着每个命令和每行响应都必须以\r\n结尾。
为了检测客户端是否已经断开连接,我安装了一个定时器,每500毫秒向客户端发送一个空消息("\r\n")。如果客户端断开连接,则Socket会抛出异常。服务器捕获此异常,关闭当前会话并接受新连接。这种解决方案很稳健,但意味着不必要的网络流量,并且必须由客户端正确处理,在获取实际响应之前过滤虚假消息。
我尝试发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)),但似乎在服务器->客户端方向上无法工作。
另一种解决方案可能是处理Socket.EndReceive返回0字节的情况。对于在“空闲”时间内发生的断开连接,它可以很好地工作。但是,如果客户端在消息传输期间断开连接,则服务器并不总是能够看到它,并且会无限期地等待。
我已经看到了几个关于此问题的线程和问题,但我从未见过任何好的解决方案。
因此,我的问题是:在.NET中检测断开连接的最佳方法是什么?
我使用第一个Socket来持续监听连接请求,并使用Socket.BeginAccept接受或拒绝客户端。当客户端被接受时,返回的新Socket用于客户端和服务器之间的通信。然后,服务器使用Socket.Begin/EndReceive等待来自客户端的命令并发送响应。服务器使用类似Telnet的协议,这意味着每个命令和每行响应都必须以\r\n结尾。
为了检测客户端是否已经断开连接,我安装了一个定时器,每500毫秒向客户端发送一个空消息("\r\n")。如果客户端断开连接,则Socket会抛出异常。服务器捕获此异常,关闭当前会话并接受新连接。这种解决方案很稳健,但意味着不必要的网络流量,并且必须由客户端正确处理,在获取实际响应之前过滤虚假消息。
我尝试发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)),但似乎在服务器->客户端方向上无法工作。
另一种解决方案可能是处理Socket.EndReceive返回0字节的情况。对于在“空闲”时间内发生的断开连接,它可以很好地工作。但是,如果客户端在消息传输期间断开连接,则服务器并不总是能够看到它,并且会无限期地等待。
我已经看到了几个关于此问题的线程和问题,但我从未见过任何好的解决方案。
因此,我的问题是:在.NET中检测断开连接的最佳方法是什么?