Windows UDP socket recvfrom返回10054错误的解决办法
2017-08-14 20:32
591 查看
现象:
在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的工作模式,让其忽略这个错误。具体做法如下:
SIO_UDP_CONNREST选项:Controls whether UDP PORT_UNREACHABLE messages are reported. Set to TRUE to enable reporting. Set to FALSE to
disable reporting.
备注:
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
在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.
备注:
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
相关文章推荐
- Windows UDP socket recvfrom返回10054错误的解决办法
- Windows UDP socket recvfrom返回10054错误的解决办法
- 调用"/Windows/wceload.exe /noui /Windows/System_SR_chs_wm.cab"后返回了部署后错误 0x00000001 的解决办法
- windows connect()返回错误的代码10061的解决办法
- 调用"/Windows/wceload.exe /noui /Windows/System_SR_chs_wm.cab"后返回了部署后错误 0x00000001 的解决办法
- 调用"/Windows/wceload.exe /noui /Windows/System_SR_chs_wm.cab"后返回了部署后错误 0x00000001 的解决办法
- windows install的错误解决办法
- vsftp 移植时遇到的“500 OOPS:socket 错误”解决办法
- windows下gem install报certificate verify failed错误解决办法或者添加淘宝源镜像失败
- Windows 8 安装.NET Framework 3.5失败(错误码:0x800f081f)的解决办法
- FTP出现“数据 Socket 错误: 连接被拒”解决办法
- 高德地图Android错误码1008、32和7;错误提示invalid_user_scode;返回key鉴权失败的解决办法
- linux下system函数错误返回-1,错误原因NO child processes的解决办法
- UDP Socket出现10054错误码的解决方法
- 在使用ASP.NET网站管理工具出现“遇到错误。请返回上一页并重试。”的解决办法!
- UDP 10054 解决办法!
- 在windows写入文件中遇到 UnicodeEncodeError: ‘gbk’ codec can’t encode character 错误的解决办法
- nodejs学习8:windows连接mongodb出现的错误解决办法
- Windows 7 安装.net framework 4.0 失败,错误HRESULT 0xc8000222解决办法