Windows UDP socket recvfrom返回10054错误的解决办法

现象:

在Windows 7系统上,A使用UDP socket,调用sendto函数向一个目标地址B发送数据,但是目标地址B没有接收数据,如果A此时立即调用recvfrom试图接收目标地址B发回的数据的话,recvfrom会立即返回-1,WSAGetLastError()返回10045。

原因:

上述现象是Windows socket的一个bug,当UDP Socket在某次发送后收到一个不可到达的ICMP包时,这个错误将在下一个接收中返回,所以上面的套接字在下一次的接收中返回了SOCKET_ERROR,错误是10054。

解决办法:

使用WSAIoctl设置UDP socket的工作模式,让其忽略这个错误。具体做法如下:

#include <Winsock2.h>
#include <Mstcpip.h>
#include <stdio.h>

#pragma comment(lib, "ws2_32.lib")
#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR, 12)

BOOL bNewBehavior = FALSE;
DWORD dwBytesReturned = 0;
WSAIoctl(iSock, SIO_UDP_CONNRESET, &bNewBehavior, sizeof bNewBehavior, NULL, 0, &dwBytesReturned, NULL, NULL);

SIO_UDP_CONNREST选项:Controls whether UDP PORT_UNREACHABLE messages are reported. Set to TRUE to enable reporting. Set to FALSE to disable reporting.

备注:

  1. setsockopt是修改套接口的属性,只是该套接口在工作的过程中需要用到的一些参数;WSAIoctl则是修改套接口的工作模式,更多的定义了这个套接口要以怎样的形式进行工作,有本质的区别。

参考文献:

[1]. http://blog.csdn.net/wpullo/article/details/5905616
[2]. http://msdn.microsoft.com/zh-cn/ms741621
[3]. http://blog.sina.com.cn/s/blog_536e955201009xqp.html
[4]. http://blog.csdn.net/threewall/article/details/5089817

时间: 2024-08-28 10:10:19

Windows UDP socket recvfrom返回10054错误的解决办法的相关文章

Nodejs发送Post请求时出现socket hang up错误的解决办法

参考nodejs官网发送http post请求的方法,实现了一个模拟post提交的功能.实际使用时报socket hang up错误. 后来发现是请求头设置的问题,发送选项中需要加上headers字段信息(这个估计也和对方的服务器有关,对于不完成的post请求头,可能被丢弃了). 完整的代码如下(遇到类型问题的同学可以做个参考): var querystring = require('querystring') , http = require('http'); var data = query

HttpWebResponse远程服务器返回错误: (500) 内部服务器错误 的解决办法

在工作中用C#开发了一个小程序,不断访问去请求一个网站的页面,在循环过程中有时会报"远程服务器返回错误: (500) 内部服务器错误",有时不会,出现的时机也不太一样.开始以为是网站的问题,后来网站是可以正常访问的,那就是自己程序的问题了. for (int i = refreshAccount.startNum; i <= refreshAccount.endNum; i++) { String data2 = urlstr; loadBranch2Request = (Htt

VS2010出现FileTracker : error FTK1011编译错误的解决办法

VS2010出现FileTracker : error FTK1011不知道是不是vs2010的一个bug,反正有人提交了. FileTracker : error FTK1011编译错误的解决办法有三个,推荐使用第二个 方法一:把目标框架改为Framewotk=4.0方法二:新增环境变量TRACKFILEACCESS=false:操作步骤:右击"我的电脑"(或"计算机")-->"高级"-->"环境变量"-->

安装Oracle客户端时,检查系统要求时状态为错误的解决办法

这是我自己安装oracle11g至win7的错误记录: 正在检查操作系统要求...要求的结果: 5.0,5.1,5.2,6.0 之一实际结果: 6.1 我换了 10g,11g从32bit到64bit折腾了好多次,最后终于找到了解决的方法-- 看到那一个错误了么?实际上是因为配置文件引起的 找到 refhost.xml 文件(位置:database/stage/prereq/db,打开 refhost.xml 配置文件并找到 <CERTIFIED_SYSTEMS> 节点,接着在节点后面修改6.0

SharePoint 2013 Distributed Cache Service错误和解决办法

接上篇 SharePoint 2013 SPDistributedCacheService 介绍与配置 本文介绍常见 Distributed Cache Service错误和解决办法. 1.  ErrorCode<ERRCAdmin010>:SubStatus<ES0001>:Specified host is not present in cluster. PS C:> Use-CacheCluster PS C:> Get-CacheHostConfig –Comp

MVC3在IIS7.5发布(部署)报403.14错误的解决办法

原文链接:http://solin.cn.blog.163.com/blog/static/536402372013410115631805/ 错误现象: 报403.14 forbidden错误 web服务器被配置为不列出此目录的内容. 解决办法: 检查站点的处理程序映射,看是否存在下列映射: ExtensionlessUrlHandler-Integrated-4.0 ExtensionlessUrlHandler-ISAPI-4.0_32bit ExtensionlessUrlHandler

Eclipse下BASE64Decoder提示错误的解决办法

解决方案1(推荐): 只需要在project build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了 解决方案2: Windows -> Preferences -> Java -> Compiler -> Errors/Warnings -> Deprecated and trstricted API -> Forbidden reference (access rules): ->

安装oracle时,检测系统要求时状态为错误的解决办法

在安装oracle时,检测系统要求时状态为错误的解决办法: 正在检查操作系统要求.... 要求的结果:5.0,5.1,5.2,6.0之一 实际结果:6.1      实际上是因为配置文件引起的      找到 refhost.xml 文件(位置:database/stage/prereq/db,打开 refhost.xml 配置文件并找到 <CERTIFIED_SYSTEMS> 节点,接着在节点后面修改6.0至6.1      <!--Microsoft Windows 7-->

Oracle10g安装中遇到的错误及解决办法

Linux环境: LSB Version: :core-3.0-ia32:core-3.0-noarch:graphics-3.0-ia32:graphics-3.0-noarchDistributor ID: RedHatEnterpriseASDescription: Red Hat Enterprise Linux AS release 4 (Nahant Update 7)Release: 4Codename: NahantUpdate7 Oracle安装版本:10201_databas