recvfrom возвращает недействительный аргумент, когда *от* передается

Я в настоящее время пишу маленькую программу сервера UDP в Linux. Сервер UDP получит пакеты от двух различных коллег и выполнит различные операции на основе, из которого однорангового узла он получил пакет. Я пытаюсь определить источник от того, где я получаю пакет. Однако, когда select возвраты и recvfrom назван, это возвращается с ошибкой Недействительного аргумента. Если я передаю ПУСТОЙ УКАЗАТЕЛЬ как предпоследние аргументы, recvfrom успешно выполняется.

Я попытался объявить fromAddr как struct sockaddr_storage, struct sockaddr_in, struct sockaddr без любого успеха. Их что-то не так с этим кодом? Действительно ли это - корректный способ определить источник пакета?

Фрагмент кода следует.

`           
    /*TODO : update for TCP. use recv */
    if((pkInfo->rcvLen=recvfrom(psInfo->sockFd,
                                pkInfo->buffer,
                                MAX_PKTSZ,
                                0,
                               /* (struct sockaddr*)&fromAddr,*/
                               NULL,
                              &(addrLen)
                              )) < 0)
    {
       perror("RecvFrom failed\n");
    }
    else
    {
       /*Apply Filter */
    #if 0
       struct sockaddr_in* tmpAddr;
       tmpAddr = (struct sockaddr_in* )&fromAddr;
       printf("Received Msg From %s\n",inet_ntoa(tmpAddr->sin_addr));
    #endif
      printf("Packet Received of len = %d\n",pkInfo->rcvLen);
    }

`
6
задан Aditya Sehgal 8 June 2010 в 17:19
поделиться

1 ответ

Вы должны инициализировать addrLen до sizeof fromAddr перед вызовом recvfrom () - это параметр ввода / вывода. Использование struct sockaddr_storage для объявления fromAddr является правильным.

18
ответ дан 8 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: