我正在用 C# 开发一台服务器,它只能接受一个客户端,我需要知道该客户端何时断开连接才能接受另一个连接请求。
我正在使用第一个 Socket,它连续监听连接请求Socket.BeginAccept
并接受或拒绝客户。当客户端被接受时,返回的新 SocketSocket.EndAccept
用于客户端和服务器之间的通信。然后,服务器等待来自客户端的命令Socket.Begin/EndReceive
并发送响应。服务器使用类似 Telnet 的协议,这意味着每个命令和每一行响应都必须以\r\n
.
为了检测客户端是否已断开连接,我安装了一个计时器,每 500 毫秒发送一条空消息(“\r\n
") 到客户端。如果客户端断开连接,则 Socket 会抛出异常。服务器捕获此异常,关闭当前会话并接受新连接。此解决方案很强大,但意味着网络上不需要的流量,并且必须由客户端正确处理,客户端必须在获得实际响应之前过滤虚拟消息。
我尝试发送一个空缓冲区(Socket.Send(new byte[1], 0, 0)
),但似乎在服务器->客户端方向上不起作用。
另一种解决方案可能是处理以下情况Socket.EndReceive
返回 0 字节。对于在“空闲”时间内发生的断开连接的情况,它工作得很好。但是,如果客户端在消息传输期间断开连接,服务器并不总是能看到它并无限期地等待。
我已经看到了有关此问题的多个线程和问题,但我从未见过任何好的解决方案。
所以我的问题是:检测 .Net 中断开连接的最佳方法是什么?
唯一的其他选择是,如果是 TCP,则让 TCP 每隔一段时间发送一个保持活动状态,这仍然是轮询,就像您现在正在做的那样,但在 TCP 层处理,因此您的协议不需要知道。
然而,没有办法绕过轮询,因为如果不向其他客户端发送某些内容并获得响应,您就无法知道它是否仍然处于连接状态。
当通过状态数据包检查(例如标准 NAPT)进行通信时,无论如何也可能需要保持活动状态,以避免远程服务器由于不活动而丢弃会话。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)