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