gpt4 book ai didi

.net - 在 .NET 中检测客户端断开连接的最佳实践?

转载 作者:可可西里 更新时间:2023-11-01 02:30:58 24 4
gpt4 key购买 nike

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

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

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

我尝试发送一个空缓冲区 (Socket.Send(new byte[1], 0, 0)),但似乎在服务器方向上不起作用->客户。

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

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

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

最佳答案

唯一的其他选择是,如果它是 TCP,则让 TCP 每隔一段时间发送一个 keep-alive,它仍在轮询,例如您现在正在做的事情,但在 TCP 层处理,因此您的协议(protocol)不会'不需要知道。

然而,没有办法绕过轮询,因为如果不向其他客户端发送内容并获得响应,您就无法知道它是否仍处于连接状态。

通过状态数据包检查(例如标准 NAPT)进行通信时,无论如何也可能需要保持事件状态,以避免远程服务器因不活动而丢弃 session 。

关于.net - 在 .NET 中检测客户端断开连接的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1367319/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com