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