如何避免TCP Socket在断开连接时抛出SocketException?

时间:2011-03-10 13:40:26

标签: c# sockets tcp

我正在开发一些C#服务器项目,而且它非常好。

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

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

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

在尝试阅读之前,有没有人知道如何“更新”连接状态?

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

2 个答案:

答案 0 :(得分:0)

在典型的TCP开发中,意外关闭连接应该是例外情况。您应该考虑实现一个更优雅的系统,其中一方首先发送一条消息,指示它将断开连接,这样双方都可以关闭连接而不会出现任何故障。

请记住,需要使用活动来确定连接是否已关闭。根据{{​​3}}上的MSDN文档,该属性仅反映在尝试上次操作时连接是否已连接

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

答案 1 :(得分:0)

看起来Socket正在从封闭的流中读取某种超时可能吗?
我会使用第二个线程,或者看看我是否可以在断开连接后将超时更改为0?