c# - 如何避免 TCP 套接字在断开连接时抛出 SocketException?

标签 c# sockets tcp

我正在做一些 C# 服务器项目,进展顺利。

今天我从异步读取改为普通读取,使用轮询。现在,当我阅读异步时,这不是问题,但现在是。

当客户端断开连接时,套接字会抛出 SocketException,该异常会导致相当长的延迟。如果我不阻止它抛出那个异常,整个服务器将卡住大约半秒钟。这似乎不值得麻烦,但服务器会获得相当多的连接和断开连接,因此确实需要很长时间。

现在我已经检查了返回 true 的 Socket.Connected 属性,但在读取方法之后它返回 false。

那么有人知道如何在尝试读取之前“更新”连接状态吗?

PS:我正在捕获异常,只是延迟太大了。

最佳答案

在典型的 TCP 开发中,连接意外关闭应该是异常(exception)的情况。您应该考虑实现一个更优雅的系统,其中一方首先发送一条消息表明它将断开连接,这样双方就可以在没有任何故障的情况下关闭连接。

请记住,需要事件来确定连接是否关闭。根据 Socket.Connected 上的 MSDN 文档,该属性仅反射(reflect)连接是否已连接在尝试最后一次操作时

如果你正在做任何重要的事情,你应该用线程隔离你的连接(不一定是每个连接一个线程,因为任何高流量的东西都会很快压垮系统),但它不应该用于单个连接独占整个服务器,无论是来自连接启动的冗长操作还是超时到期。

关于c# - 如何避免 TCP 套接字在断开连接时抛出 SocketException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5260376/

相关文章:

objective-c - 在 iOS 中针对不同的应用程序状态使用套接字的正确方法是什么?

javascript - 从 javascript/Nodejs 中未知大小的字节流中解码前置的 VarInt

Golang tcp-tls over socks5 代理客户端

C#用Kinect模拟多点触控

c# - INNER JOINS 和 LEFT JOINS 的 EF Core 困难

c# - 旋转后获取坐标

c# - 异步 - 等待直到有人尝试连接

java - 来自客户端的第一个字符串由服务器发送并显示。之后服务器就没有收到了吗?

sockets - 如何控制Scala远程actor的TCP_NODELAY设置?

c# - 如何在不链接的情况下从 .NET 使用命令行 Matlab?