Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检测意外的套接字断开_C#_Sockets - Fatal编程技术网

C# 检测意外的套接字断开

C# 检测意外的套接字断开,c#,sockets,C#,Sockets,这不是一个关于如何做到这一点的问题,而是一个关于我所做的是否是错误的问题。我曾读到,在等待数据(BeginReceive)时,如果不使用计时器或常规发送的消息等,则无法检测套接字是否意外关闭(如关闭服务器/客户端进程、拔掉网络电缆)。但有相当一段时间我一直在使用以下设置来实现这一点,到目前为止,它一直运作良好 public void OnReceive(IAsyncResult result) { try { var bytesReceived = this.So

这不是一个关于如何做到这一点的问题,而是一个关于我所做的是否是错误的问题。我曾读到,在等待数据(BeginReceive)时,如果不使用计时器或常规发送的消息等,则无法检测套接字是否意外关闭(如关闭服务器/客户端进程、拔掉网络电缆)。但有相当一段时间我一直在使用以下设置来实现这一点,到目前为止,它一直运作良好

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
    }
}
public void OnReceive(IAsyncResult结果)
{
尝试
{
var bytesReceived=this.Socket.endReceived(结果);

如果(bytesReceived,则完全可以这样做。总体思路是:

如果
EndReceive
返回除零以外的任何值
,则需要处理传入数据

如果
EndReceive
返回零,则远程主机已关闭其连接端。这意味着,如果编程允许,远程主机仍可接收您发送的数据,但在任何情况下都无法发送更多数据。通常情况下,发生这种情况时,您还将关闭连接端,从而完成有序的连接Hutton,但这不是强制性的

如果
EndReceive
抛出
,则连接出现异常终止(进程终止、网络电缆切断、电源丢失等)

您必须注意以下几点:

  • EndReceive
    不能返回小于零的值(代码中的测试具有误导性)
  • 如果抛出,它可以抛出除
    SocketException
    之外的其他类型的异常
  • 如果它返回零,您必须小心停止调用
    BeginReceive
    ;否则您将在
    BeginReceive
    EndReceive
    之间开始一场无限的、毫无意义的乒乓球游戏(它将显示在您的CPU使用情况中)。您的代码已经完成了这项操作,因此无需更改任何内容

  • +1特别是因为我喜欢你说的“如果它是按程序设计的”.1我还想指出,除非重新抛出,否则您永远不应该有一个catch语句捕获所有内容。@Alex我不同意禁止捕获所有异常,除非您重新抛出它们。我有一个TCP服务器类,它的工作原理与这里的非常类似,我不希望有任何随机异常终止整个ser这就是我捕获所有异常并将其传递给OneExceptionCapture事件处理程序的原因,该处理程序应连接到某些日志记录功能等。接收回调中未捕获的异常(如此处所示),从线程池转到线程-这是第一次意外异常的结束,因此VisualStudio使用消息“异常未由用户代码处理”停止应用程序。只有在visual studio中运行程序并可以继续运行时,才会发生这种情况,但除非您有AppDomain.UnhandledException的事件处理程序,否则应用程序将终止。显然,这不是此事件的目的。AppDomain.UnhandledException更像是为事后调试编写堆栈跟踪的最后手段。。。。