Прослушивание UDP-трансляции - PullRequest
1 голос
/ 05 ноября 2011

Мне нужно прослушать сетевую трансляцию через UDP. Дейтаграмма содержит структуру j4cDAC_broadcast. Я попробовал следовать нескольким учебникам, но они, кажется, оставили некоторые вещи и не имеют очень подробных объяснений, если таковые имеются.

С тем, что у меня сейчас есть, я получаю ошибку BIND FAILED 10049, а ошибка 10049 указывает, что адрес недоступен. Трансляция идет 255.255.255.255:7654. Как мне исправить эту ошибку?

Это то, что я имею до сих пор:

void test() 
    {
    WSADATA  wsd;
    SOCKET s;
    j4cDAC_broadcast recieve;
    char *read = (char*) malloc(sizeof(j4cDAC_broadcast));
    int ret;
    DWORD dwSenderSize;
    sockaddr_in local;

    if (WSAStartup(MAKEWORD(2,2),&wsd) != 0)
        {
        cout << "WSAStartup failed";
        exit(1);
        }

    local.sin_family = AF_INET;
    local.sin_port = htons ((short)BCASTPORT);
    local.sin_addr.s_addr = inet_addr(BCASTIP);


    s = socket(AF_INET, SOCK_DGRAM, 0 );

    if (s == INVALID_SOCKET)
        {
        cout << "SOCKET FAILED!: " << WSAGetLastError();               
        exit(1);
        }

    int bnd = bind(s,(SOCKADDR*) &local,sizeof(local) );

    if (bnd != 0 )
        {
        cout << "BIND FAILED: " << WSAGetLastError();     //fails here
        return;
        }


    ret = recv (s, read,sizeof(j4cDAC_broadcast),0);

    if (ret == SOCKET_ERROR)
        {
        cout << "RECIEVE FAILED " << WSAGetLastError();            
        return;
        }

    memcpy(&recieve,read,sizeof(read));


    closesocket(s);

    WSACleanup();
    }

Также еще одна вещь, которую я не смог найти, это как получить IP-адрес отправителя из заголовка.

1 Ответ

4 голосов
/ 05 ноября 2011

Вы не привязываетесь к адресу вещания; Вы привязываетесь к локальному IP-адресу машины (или 0.0.0.0 для всех них). Трансляции все равно дойдут до сокета. Вот почему это трансляция. Логика «этот пакет отправляется на широковещательный адрес, значит, мы хотим его получить» происходит на уровне стека TCP / IP.

Не привязывать к 127.0.0.1.

Чтобы получить адрес отправителя, используйте recvfrom() и запишите предпоследний параметр.

...