zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Sql语句中IN和exists的区别及应用
    时间戳/Date(1354116249000)/ 转换
    SqlServer不允许更改字段类型(表中已有数据)
    Firefox内存占用过高解决方法
    接口开发中的测试问题
    c# winform 窗体起始位置 设置
    【整理】C#文件操作大全(SamWang)
    C#实现JSON序列化与反序列化
    解决方案资源管理器中跟踪活动项
    C#中方法的参数的四种类型
  • 原文地址:https://www.cnblogs.com/cnpirate/p/4059137.html
Copyright © 2011-2022 走看看