gpt4 book ai didi

c# - 检测意外的套接字断开连接

转载 作者:太空狗 更新时间:2023-10-29 22:19:50 29 4
gpt4 key购买 nike

这不是关于如何做到这一点的问题,而是关于我这样做是否错误的问题。我读过在等待数据(开始接收)时无法检测到套接字是否意外关闭(例如终止服务器/客户端进程,拉网络电缆),而不使用计时器或定期发送的消息等。但是很长一段时间以来,我一直在使用以下设置来执行此操作,到目前为止它一直运行良好。

public void OnReceive(IAsyncResult result)
{
try
{
var bytesReceived = this.Socket.EndReceive(result);

if (bytesReceived <= 0)
{
// normal disconnect
return;
}

// ...

this.Socket.BeginReceive...;
}
catch // SocketException
{
// abnormal disconnect
}
}

现在,既然我已经读过这不容易,我想知道我的方法是否有问题。有没有?还是终止进程和拉电缆等之间有区别?

最佳答案

完全有可能并且可以这样做。总体思路是:

如果 EndReceive 返回任何非零值,则您有传入数据要处理。

如果 EndReceive 返回零,则远程主机已关闭其连接端。这意味着它仍然可以接收你发送的数据,如果它被编程为这样做的话,但在任何情况下都不能再发送它自己的数据。通常发生这种情况时,您还将关闭连接,从而完成有序关闭,但这不是强制性的。

如果 EndReceive 抛出,则连接异常终止(进程终止、网线断开、断电等)。

需要注意的几点:

  1. EndReceive 永远不会返回小于零的值(您代码中的测试具有误导性)。
  2. 如果它抛出,除了 SocketException 之外,它还可以抛出其他类型的异常。
  3. 如果它返回零,您必须小心停止调用 BeginReceive;否则,您将在 BeginReceiveEndReceive 之间开始无限且无意义的乒乓球游戏(它将显示在您的 CPU 使用率中)。您的代码已经执行此操作,因此无需更改任何内容。

关于c# - 检测意外的套接字断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11340312/

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