当前位置: 首页 > news >正文

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,错误是10045。

解决办法:

使用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

转载于:https://www.cnblogs.com/cnpirate/p/4059137.html

相关文章:

  • 关于安排
  • C#委托
  • 力扣(LeetCode)965
  • 快速上手git
  • Android开发最佳学习路线图
  • 相对友好的 AVL Tree 教程
  • oracle中sql优化读书笔记1-优化器
  • SpringBoot之devtools热部署
  • Web自动化测试框架Watir(基于Ruby) - 第2章 使用Watir写自动化测试脚本
  • JSP 动作元素
  • Git很好的教程
  • 效果逆天的通用语言模型GPT 2.0来了,它告诉了我们什么?
  • [转]页面换肤功能浅析
  • 域名在QQ微信被拦截怎么办 怎么样才能让被微信屏蔽的网址正常访问使用
  • Cocos2dX Android 编译出错
  • 【技术性】Search知识
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • Effective Java 笔记(一)
  • es6要点
  • Hexo+码云+git快速搭建免费的静态Blog
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • jquery cookie
  • Linux各目录及每个目录的详细介绍
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • spark本地环境的搭建到运行第一个spark程序
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • 分布式事物理论与实践
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 给初学者:JavaScript 中数组操作注意点
  • 回顾 Swift 多平台移植进度 #2
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端设计模式
  • 浅谈web中前端模板引擎的使用
  • 删除表内多余的重复数据
  • 使用 Docker 部署 Spring Boot项目
  • 问题之ssh中Host key verification failed的解决
  • 异步
  • 正则表达式
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • elasticsearch-head插件安装
  • 第二十章:异步和文件I/O.(二十三)
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #DBA杂记1
  • (Forward) Music Player: From UI Proposal to Code
  • (ros//EnvironmentVariables)ros环境变量
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)linux使用docker容器运行mysql
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (转载)(官方)UE4--图像编程----着色器开发
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET导入Excel数据