原文地址: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){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。

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。

转载:http://www.cnblogs.com/wolf-sun/p/3366353.html

[Socket网络编程]一个封锁操作被对 WSACancelBlockingCall 的调用中断。相关推荐

  1. WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决

    今天在进行网络通信调试的时候遇到一个错误:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断. 错误的发生情况如下: Server: 1. 一个线程启动一个socket ...

  2. 一个封锁操作被对 wsacancelblockingcall 的调用中断_操作系统概论

    操作系统概述 OS基本概念 对用户和程序猿提供接口 命令接口 联机命令接口(交互式命令接口) 向计算机输入一条指令,它会先解析命令然后执行这条指令,完成后可在输入下一条指令.这种操作的好处在于人机交互 ...

  3. python socket mysql_5.Python操作MySQL,三层架构,Socket网络编程

    Python操作MySQL - MySQL之查询操作 - MySQL之插入数据 - MySQL之批量插入数据 - MySQL之删除数据 - MySQL之更新数据库 - MySQL之事务 - MySQL ...

  4. Linux C++/Java/Web/OC Socket网络编程

    一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...

  5. Socket网络编程(2)--服务端实现

    中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...

  6. Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程

    目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...

  7. Socket网络编程笔记

    网络.计算机网络的构成是什么? 网络: 在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它可以把各个点.面(组织之间).体(例如公共app)的信息联系到一起,从而实现这些资源的共享. 局域网 ...

  8. Python面向对象进阶和socket网络编程

    写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...

  9. BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程

    BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...

最新文章

  1. python 开发板-MicroPython:STM32 上 的 Python 开发
  2. LeetCode 1114. Print in Order--Java解法--并发问题
  3. 揪出“凶手”——实战WinDbg分析电脑蓝屏原因
  4. dede 表单必填_织梦dedecms自定义表单选项必填怎么修改
  5. python dry原则_python使用建议与技巧分享(一)
  6. 对偶问题复习要点整理
  7. Html5 History API解析
  8. MyEcplise安装Freemarker插件(支持.ftl文件)
  9. Linux 学习笔记_10_Shell编程_2_Shell编程语法(三)
  10. python 发送邮件附件及文字信息
  11. [USACO13FEB]Perimeter【DFS / 深搜】
  12. JavaScript基础函数的配置对象Configuration Objects(020)
  13. Git安装包(win64)镜像下载地址
  14. 警惕食源性疾病——食源性病原菌介绍
  15. 计算机组成原理 2:总线
  16. linux win10双系统启动顺序,Windows 10 和 Ubuntu 20.04 双系统 GRUB2 默认启动项的更改...
  17. ABOV A96R725 seting Music调谐器设置应用
  18. 中秋国庆长假,SEO你在坚持吗?
  19. 19c打补丁简易步骤
  20. 如何学习深度学习——我的高质量学习资源列表

热门文章

  1. android 流量统计不准确_汽车里程表上显示的百公里油耗准确吗?是不是真的是欢乐表...
  2. servlet 认证,授权
  3. OGNL是Object-Graph Navigation Language
  4. java poi 导出excel 数字有问题
  5. JQuery弹出层,点击按钮后弹出遮罩层,有关闭按钮
  6. 进入前端开发这个领域 ,请问如何进行系统的学习?
  7. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
  8. lintcode-828. 字模式
  9. bootstrap3中select2的默认值和下拉框的禁用
  10. Scala 隐式(implicit)详解