添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

原文地址: http://www.cnblogs.com/xiwang/archive/2012/10/25/2740114.html 记录在此,方便查阅。

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

接收时的代码如下:

IPEndPoint ipendpoint = new IPEndPoint(IPAddress.Any, 0);
            Thread thread = new Thread(() =>
                        while (!m_StopListen)
                                if (m_udpClient.Client == null) return;
                                byte[] bytes = m_udpClient.Receive(ref ipendpoint);
                                string str = Encoding.Default.GetString(bytes);
                                Console.WriteLine(string.Format("接收的数据是: {0},来自IP:{1} ,端口 : {2}", str, ipendpoint.Address.ToString(), ipendpoint.Port));
                            catch (Exception ex)
                                Console.WriteLine(ex.Message);
                            Thread.Sleep(100);
            thread.IsBackground = true;
            thread.Start();
if (m_udpClient.Available <= 0) continue; if (m_udpClient.Client == null) return; byte[] bytes = m_udpClient.Receive(ref ipendpoint); string str = Encoding.Default.GetString(bytes); Console.WriteLine(string.Format("接收的数据是: {0},来自IP:{1} ,端口 : {2}", str, ipendpoint.Address.ToString(), ipendpoint.Port));

原因:MSDN对Available的解释是:

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

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

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