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

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

现象:html

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

缘由:tcp

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

解决办法:post

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

#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..net

备注:htm

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

参考文献:blog

[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接口

posted @ 2014-10-29 12:03 朝雾之归乡 阅读(2301) 评论(0) 编辑 收藏

相关文章
相关标签/搜索