Winsock UDP广播数据包未发送

时间:2016-02-19 18:49:33

标签: c++ windows udp winsock2

当多个网络适配器处于活动状态但是一个网络适配器断开连接时,我遇到了使用winsock的奇怪问题。

这是基本情景:

  1. Wifi和以太网处于活动状态并已连接
  2. 启动应用,发送UDP广播并接收回复
  3. 拔下以太网,重新启动应用程序并尝试再次发送 - 没有发送任何内容(Wireshark没有显示任何内容,似乎Windows在它们到达NIC之前丢弃了它们?)
  4. 禁用已断开连接的以太网适配器并重试 - 通过Wifi发送正常并获得响应。
  5. 现在这是一个非常具体的场景,但我相信在其他情况下会发生这种情况,这只是我知道每次重现它的唯一方法。

    以下是UDP发送的代码片段,本例假设dstAddrStr为192.168.1.255

    struct sockaddr_in sa_remote;
    SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock == INVALID_SOCKET) {
        printf("Error creating socket: %ld\n", WSAGetLastError());
    }
    
    int enable = 1;
    if ((setsockopt(sock,
        SOL_SOCKET, SO_BROADCAST, (char*)&enable, sizeof(enable))) == -1) {
        printf("Error enabling broadcasts: %ld\n", WSAGetLastError());
    }
    
    const MIB_IPADDRROW & row = iptbl->table[i];
    uint32 ipAddr = ntohl(row.dwAddr);
    uint32 netmask = ntohl(row.dwMask);
    uint32 baddr = ipAddr & netmask;
    if (row.dwBCastAddr) baddr |= ~netmask;
    
    char dstAddrStr[32];  Inet_NtoA(baddr, dstAddrStr);
    
    memset(&sa_remote, 0, sizeof(struct sockaddr_in));
    sa_remote.sin_family = AF_INET;
    sa_remote.sin_addr.s_addr = inet_addr(dstAddrStr);
    sa_remote.sin_port = htons(_DST_PORT);
    
    
    if (sendto(sock, dpString, strlen(dpString), 0, (struct sockaddr *)&sa_remote, sizeof(struct sockaddr_in)) < 0){
        printf("UDP send error Error: %ld", WSAGetLastError());
        break;
    }
    

0 个答案:

没有答案
相关问题