Я в настоящее время пишу маленькую программу сервера 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);
}
`
Вы должны инициализировать addrLen
до sizeof fromAddr
перед вызовом recvfrom ()
- это параметр ввода / вывода. Использование struct sockaddr_storage
для объявления fromAddr
является правильным.