[Socket网络编程]一个封锁操作被对 WSACancelBlockingCall 的调用中断。
原文地址: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 的调用中断。相关推荐
- WSAGetLastError:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断 的解决
今天在进行网络通信调试的时候遇到一个错误:10004 一个封锁操作被对 WSACancelBlockingCall的调用中断. 错误的发生情况如下: Server: 1. 一个线程启动一个socket ...
- 一个封锁操作被对 wsacancelblockingcall 的调用中断_操作系统概论
操作系统概述 OS基本概念 对用户和程序猿提供接口 命令接口 联机命令接口(交互式命令接口) 向计算机输入一条指令,它会先解析命令然后执行这条指令,完成后可在输入下一条指令.这种操作的好处在于人机交互 ...
- python socket mysql_5.Python操作MySQL,三层架构,Socket网络编程
Python操作MySQL - MySQL之查询操作 - MySQL之插入数据 - MySQL之批量插入数据 - MySQL之删除数据 - MySQL之更新数据库 - MySQL之事务 - MySQL ...
- Linux C++/Java/Web/OC Socket网络编程
一,Linux C++ Socket网络编程 1.什么是TCP/IP.UDP? TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制 ...
- Socket网络编程(2)--服务端实现
中秋了,首先祝大家中秋快乐,闲着无事在家整一个socket的聊天程序,有点仿QQ界面,就是瞎折腾,不知道最后是不是能将所有功能实现. 如果你对socket不了解,请看这篇文章:http://www.c ...
- Linux Kernel TCP/IP Stack — Socket Layer — TCP/UDP Socket 网络编程
目录 文章目录 目录 TCP/UDP Socket 逻辑架构 创建 Socket 绑定 Socket 请求建立 Socket 连接 监听 Socket 接受请求 关闭连接 数据的发送和接收 send ...
- Socket网络编程笔记
网络.计算机网络的构成是什么? 网络: 在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它可以把各个点.面(组织之间).体(例如公共app)的信息联系到一起,从而实现这些资源的共享. 局域网 ...
- Python面向对象进阶和socket网络编程
写在前面 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese:def __init__(self, ...
- BIO,Socket网络编程入门代码示例,NIO网络编程入门代码示例,AIO 网络编程
BIO,Socket网络编程入门代码示例 1.BIO服务器端程序 package cn.itcast.bio;import java.io.InputStream; import java.io.Ou ...
最新文章
- python 开发板-MicroPython:STM32 上 的 Python 开发
- LeetCode 1114. Print in Order--Java解法--并发问题
- 揪出“凶手”——实战WinDbg分析电脑蓝屏原因
- dede 表单必填_织梦dedecms自定义表单选项必填怎么修改
- python dry原则_python使用建议与技巧分享(一)
- 对偶问题复习要点整理
- Html5 History API解析
- MyEcplise安装Freemarker插件(支持.ftl文件)
- Linux 学习笔记_10_Shell编程_2_Shell编程语法(三)
- python 发送邮件附件及文字信息
- [USACO13FEB]Perimeter【DFS / 深搜】
- JavaScript基础函数的配置对象Configuration Objects(020)
- Git安装包(win64)镜像下载地址
- 警惕食源性疾病——食源性病原菌介绍
- 计算机组成原理 2:总线
- linux win10双系统启动顺序,Windows 10 和 Ubuntu 20.04 双系统 GRUB2 默认启动项的更改...
- ABOV A96R725 seting Music调谐器设置应用
- 中秋国庆长假,SEO你在坚持吗?
- 19c打补丁简易步骤
- 如何学习深度学习——我的高质量学习资源列表
热门文章
- android 流量统计不准确_汽车里程表上显示的百公里油耗准确吗?是不是真的是欢乐表...
- servlet 认证,授权
- OGNL是Object-Graph Navigation Language
- java poi 导出excel 数字有问题
- JQuery弹出层,点击按钮后弹出遮罩层,有关闭按钮
- 进入前端开发这个领域 ,请问如何进行系统的学习?
- Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION
- lintcode-828. 字模式
- bootstrap3中select2的默认值和下拉框的禁用
- Scala 隐式(implicit)详解