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