[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

时间: 2024-09-11 02:07:52

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

”一个封锁操作被对 WSACancelBlockingCall 的调用中断“。解决办法

问题描述: 为了防止界面卡死,在服务端我新开了一个进程来监听客户端的连接请求,在关闭的时候却却提示"一个封锁操作被对 WSACancelBlockingCall 的调用中断". 如图 具体错误代码:        private void InitForm()         {             MyController = new ControllerManager(this);   /创建一个新的进程,以防界面卡死             new Thread(MyCont

无法从传输连接中读取数据: 一个封锁操作被对 WSACancelBlockingCall 的调用中断?

问题描述 小弟开发的是一个基于tcpclienttcplistener的网络聊天程序,采用了委托/回调的多线程机制,连接服务器均正常,但是当客户端断开连接时,就会产生如题的异常,下面是部分代码:privatevoidReceiveData()//由请求连接按钮启动的线程{while(true){netStream=client.GetStream();byte[]bytes=newbyte[64];netStream.Read(bytes,0,bytes.Length);//异常出现地方stri

Socket网络编程学习笔记(1):常用方法介绍

虽然天天上博客园欣赏各位"大侠"的杰作,偶然回首,突然发 现自己已成"潜水者"久矣.本来对于自己有限的水平,有点不好意 思在此发贴,不过潜伏久了,才慢慢意识到老是通过浏览他人的文章虽然能够提 高自己能力,能够及时的获取新技术新思想,但却只能停留在他人的思想上.通 过学习,加上自己的想法,再写出来,让大家来指证错误,不仅能够巩固自己的 知识,也可以让一些跟我一样迷惘的朋友们不用再去走一些弯路,岂不是两全其 美,本着这样的想法,打算把自己平时的所学所想都写下来,欢迎各路

python之Socket网络编程详解_python

什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在计算机领域中,网络是信息传输.接收.共享的虚拟平台,通过它把各个点.面.体的信息联系到一起,从而实现这些资源的共享.网络是人类发展史来最重要的发明,提高了科技和人类社会的发展. 网络通信的三要素 IP地址 用来表示一台独立的主机 特殊的IP地址 127.0.0.1或称localhost(表示本地回环

Socket网络编程学习笔记(3):利用套接字助手类

在上一篇中已经介绍了利用Socket建立服务端和客户端进行通信,如果需要 的朋友可访问<Socket网络编程学习笔记(2):面向连接的Socket>.在本篇 中,将利用C#套接字的助手类来简化Socket编程,使得刚刚接触到网络编程的 朋友们更容易上手. 跟上篇一样,通过C#套接字的助手类来编程同样分 服务端和客户端. 一.服务端侦听模式 1.创建套接字与 IPEndPoint绑定,并设置为侦听模式. 1//创建IPEndPoint实例 2 IPEndPoint ipep = new IPEn

Python Socket 网络编程

原文:Python Socket 网络编程 Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ 聊天.收发 email 等等.要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了. 本文主要介绍使用 Python 进

socket 网络编程传输文件

问题描述 socket 网络编程传输文件 进行网络通信,socket编程,传输文件过程中,如何来通过调用函数来获得传输文件的大小,以及传输该文件相对应的时间,有什么好的办法吗? 解决方案 从来没弄过Socket的一些东西,最近看了看,一些小东西,希望能帮到和我一样的菜鸟.1.win32程序下的文件传输1.1.Client Code#include #include long GetFileLen(FILE *_file){ long curPosit=ftell(_file)fileLen; f

socket网络编程 文件传输的问题?

问题描述 socket网络编程 文件传输的问题? socket网络编程,目前是同时开启两个进程两个线程,同时从server那端传输两个文件过来,是可以实现,任意格式的文件和任何大小的文件都可以.现在的项目要求是这两个进程要同时传输一个文件.我的思路是一个进程传输该文件的前一半,另一个进程传输该文件的后一半,具体实现就不知道了,希望大家给点意见,已经摸索了好几天.毫无头绪啊!!!!!项目马上就要完成了,谢谢大家. 解决方案 RandomAccessFile,看看吧. 解决方案二: 循序渐进Sock

socket-Windows Socket网络编程中使用的IP地址是公网IP还是内网IP?

问题描述 Windows Socket网络编程中使用的IP地址是公网IP还是内网IP? 因为我按照书上的代码写了一个程序,就是connect什么什么的,我写的MFC做客户端,网络调试助手做服务器端,然后从网络调试助手向MFC程序发送信息.当网络调试助手和MFC程序在一台电脑上时连接是可以成功的,但是在两台电脑上时就不成功了,调试的时候就是connect半天没反应,然后就失败了.IP地址我都填对的.(如果是两个网络调试助手在两台电脑上是能成功连接的,但是我找不到网络调试助手的源代码) 有谁知道是什