[Socket网络编程]一个封锁操作被对 WSACancelBlockingCall 的调用中断。
2013-10-13 09:15
483 查看
原文地址:http://www.cnblogs.com/xiwang/archive/2012/10/25/2740114.html记录在此,方便查阅。
C#中在使用UDPClient循环监听端口,在断开UPDClient的时候,使用try...catch捕获了异常,System.NET.Sockets.SocketException“一个封锁操作被对 WSACancelBlockingCall 的调用中断”,ErrorCode=10004。
接收时的代码如下:
停止监听的代码:
解决办法:
在开始调用UDPClient的Receive方法之前对UDPClient.Available属性进行判断,当Available属性大于0时才开始从缓冲区读取网络数据:
原因:MSDN对Available的解释是:
“Available 属性用于确定在网络缓冲区中排队等待读取的数据的量。 如果数据可用,可调用 Read 获取数据。 如果无数据可用,则 Available 属性返回 0。
如果远程主机处于关机状态或关闭了连接,则 Available 属性将引发SocketException。如果远程主机处于关机状态或关闭了连接,则 Available 属性将引发SocketException”。
也就是说,错误的原因在于,但调用Close后,线程恰好继续向网络缓冲区中读取数据,所以引发SocketException。
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) { try { 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();
停止监听的代码:
this.m_StopListen = true; m_udpClient.Close(); m_udpClient = null;
解决办法:
在开始调用UDPClient的Receive方法之前对UDPClient.Available属性进行判断,当Available属性大于0时才开始从缓冲区读取网络数据:
try { 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。
相关文章推荐
- UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断
- 一个封锁操作被对 WSACancelBlockingCall 的调用中断 ErrorCode=10004
- ”一个封锁操作被对 WSACancelBlockingCall 的调用中断“。解决办法
- 《在C#中实现Socket端口复用》 以及《 UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断。》
- WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
- 一个封锁操作被对WSACancelBlockingCall的调用中断
- 一个封锁操作被对 WSACancelBlockingCall 的调用中断
- [分享]一个封锁操作被对 WSACancelBlockingCall 的调用中断 ErrorCode=10004
- Error: 10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
- 《在C#中实现Socket端口复用》 以及《 UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断。》问题
- 一个封锁操作被对 WSACancelBlockingCall 的调用中断
- 《在C#中实现Socket端口复用》 以及《 UDP 一个封锁操作被对 WSACancelBlockingCall 的调用中断。》问题
- 一个封锁操作被对 WSACancelBlockingCall 的调用中断 ErrorCode=10004
- 一个封锁操作被对WSACancelBlockingCall的调用中断(在线)
- 一个封锁操作被对 WSACancelBlockingCall 的调用中断 ErrorCode=10004
- ”一个封锁操作被对 WSACancelBlockingCall 的调用中断“。解决办法
- How to cancel an asynchronous call? 异步调用 的中断 取消 c#
- 突破网吧限制还上网一个自由空间----破解taskmgr对进程操作的封锁
- 【廖雪峰 python教程 课后题 切片】利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:
- TBD socket client请求,在向远端ip:port发送时,会随机找个本地可用端口去向远端ip:port 发起net io write操作。远端accept后的sockets都共享一个端口