C#中在使用UDPClient循环监听端口,在断开UPDClient的时候,使用try...catch捕获了异常,System.NET.Sockets.SocketException“一个封锁操作被对

 解决办法:

      在开始调用UDPClient的Receive方法之前对UDPClient.Available属性进行判断,当Available属性大于0时才开始从缓冲区读取网络数据:

            public void UDPReciveMore()
    {
        try
        {
            while (IsClose)
            {
                if (clientRec.Available <= 0) { continue; }
                byte[] buf = clientRec.Receive(ref endpointRec);
                ReceiveCallBackUDPMore(buf.Length, ref buf);//ReceiveCallBackUDPMore
            }
        }
        catch (Exception e)
        {
            Debug.LogError("异常: " + e);
        }
    }

原因:MSDN对Available的解释是:

      “Available 属性用于确定在网络缓冲区中排队等待读取的数据的量。 如果数据可用,可调用 Read 获取数据。 如果无数据可用,则 Available 属性返回 0。

    如果远程主机处于关机状态或关闭了连接,则 Available 属性将引发SocketException如果远程主机处于关机状态或关闭了连接,则 Available 属性将引发SocketException”。

           也就是说,错误的原因在于,但调用Close后,线程恰好继续向网络缓冲区中读取数据,所以引发SocketException。

错误文档:  点击打开链接

猜你喜欢

转载自blog.csdn.net/qq_35433081/article/details/80619849
今日推荐