recvfrom возвращает недопустимый аргумент при передаче *from*

в настоящее время я пишу небольшую серверную программу 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 failedn");
    }
    else
    {
       /*Apply Filter */
    #if 0
       struct sockaddr_in* tmpAddr;
       tmpAddr = (struct sockaddr_in* )&fromAddr;
       printf("Received Msg From %sn",inet_ntoa(tmpAddr->sin_addr));
    #endif
      printf("Packet Received of len = %dn",pkInfo->rcvLen);
    }

`

2 ответов


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


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

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);