recvfrom возвращает неверный аргумент при передаче * from * - PullRequest
6 голосов
/ 08 июня 2010

В настоящее время я пишу небольшую программу на сервере UDP в Linux.UDP-сервер будет принимать пакеты от двух разных одноранговых узлов и будет выполнять разные операции в зависимости от того, от какого узла он получил пакет.Я пытаюсь определить источник, откуда я получаю пакет.Однако когда возвращается select и вызывается recvfrom, возвращается с ошибкой Недопустимый аргумент .Если я передам NULL в качестве второго последнего аргумента, 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);
    }

`

Ответы [ 2 ]

18 голосов
/ 09 июня 2010

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

1 голос
/ 30 мая 2013

У меня была такая же проблема:

Invalid arguments 'Candidates are: int recvfrom(int, void *, unsigned int, int,
                   sockaddr *, unsigned int *) '

в том же коде:

recvfrom(sockFd, buffer, MAX_PKTSZ, 0, (struct sockaddr*)&fromAddr, &addrLen)

Моя ошибка заключалась в том, что я использовал обычный int тип вместо unsigned int для addrLen

unsigned int addrLen;
addrLen = sizeof(fromAddr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...