Не удается получить пакет UNICAST через WiFi с использованием INADDR_ANY - PullRequest
0 голосов
/ 31 января 2019

У меня есть устройство, вещающее через Ethernet, используя приведенный ниже код, он успешно получает пакеты.Устройство также одноадресно передает тот же пакет через WiFi, но это не получено (Отключая все другие интерфейсы, кроме WiFi, в Windows появляется ошибка тайм-аута).Если я изменю:

address.sin_addr.s_addr = htonl(INADDR_ANY);

на

address.sin_addr.s_addr = inet_addr("192.168.0.13");

Какой адрес интерфейса Wi-Fi принимает пакеты.Пакеты по Ethernet и WiFi можно увидеть в WireShark, единственное различие между ними - это адреса назначения (широковещательный и одноадресный) и ttl.

Вот код:

int main()
{
    int iResult;
    char recv_buf[4000];
    int opt = 1;
    WORD wVersionRequested;
    WSADATA wsaData;
    int err;

    wVersionRequested = MAKEWORD(2, 2);

    err = WSAStartup(wVersionRequested, &wsaData);
    if (err != 0) {
        printf("WSAStartup failed with error: %d\n", err);
        return 1;
    }

    SOCKET handle = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

    int return_code = 0;

    return_code = setsockopt(handle, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast<char *>(&opt), sizeof(opt));

    std::cout<<"socket option 1 return:" << return_code << std::endl;

    DWORD tv = 100;
    return_code = setsockopt(handle, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char *>(&tv), sizeof(tv));

    std::cout << "socket option 2 return:" << return_code<< std::endl;

    sockaddr_in address;
    address.sin_family = AF_INET;
    address.sin_port = htons(3000);
    address.sin_addr.s_addr = htonl(INADDR_ANY);
    //address.sin_addr.s_addr = inet_addr("192.168.0.13"); //this works
    memset(&address.sin_zero, 0, sizeof(address.sin_zero));

    std::cout << "bind return:" <<  bind(handle, (const sockaddr *)&address, sizeof(sockaddr_in)) << std::endl;

    // Receive data until the server closes the connection
    do {
        Sleep(5000);
        iResult = recv(handle, recv_buf, 4000, 0);
        if (iResult > 0)
            printf("Bytes received: %d\n", iResult);
        else if (iResult == 0)
            printf("Connection closed\n");
        else
            printf("recv failed: %d\n", WSAGetLastError());
    } while (true);

    return 0;
}
...