博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Socket网络编程]一个封锁操作被对 WSACancelBlockingCall 的调用中断。
阅读量:4649 次
发布时间:2019-06-09

本文共 2286 字,大约阅读时间需要 7 分钟。

原文地址:记录在此,方便查阅。

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 属性用于确定在网络缓冲区中排队等待读取的数据的量。 如果数据可用,可调用  获取数据。 如果无数据可用,则 Available 属性返回 0。

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

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

     

  • 博客地址:
    博客版权:如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步! 再次感谢您耐心的读完本篇文章。

转载于:https://www.cnblogs.com/asdyzh/p/9886054.html

你可能感兴趣的文章
python的N个小功能(更新文件)
查看>>
【bzoj 4390】 [Usaco2015 dec]Max Flow(树上差分)
查看>>
FPGA内部硬件结构简介
查看>>
前端开发面试题总结-代码篇
查看>>
javaweb学习总结(三十一)——国际化(i18n)
查看>>
23种设计模式[1]:单例模式
查看>>
好的学习材料
查看>>
【DRF分页】
查看>>
6.1 文件对象常用方法与属性
查看>>
排列组合问题
查看>>
小知识点
查看>>
【笔记】HybridApp中使用Promise化的JS-Bridge
查看>>
模拟赛 sutoringu
查看>>
hdu 1253 胜利大逃亡 (广搜)
查看>>
华为上机试---购物单(算法:背包问题)
查看>>
PHP操作Mongodb API 及使用类 封装好的MongoDB操作类
查看>>
PHP实现经典算法
查看>>
NodeJS(四)Mac下如何安装package.json里面会产生依赖项
查看>>
MapReduce会自动忽略文件夹下的.开头的文件
查看>>
Android Learning:数据存储方案归纳与总结
查看>>