Actualmente estoy escribiendo un pequeño programa de servidor UDP en Linux. El servidor UDP recibirá paquetes de dos iguales diferentes y realizará diferentes operaciones según el par al que recibió el paquete. Estoy tratando de determinar la fuente de donde recibo el paquete. Sin embargo, cuando se devuelve select
y se invoca recvfrom
, se devuelve con un error de Argumento no válido. Si paso NULL como segundo segundo argumento, recvfrom tiene éxito.recvfrom devuelve argumento no válido cuando * de * se pasa
He intentado declarar fromAddr como struct sockaddr_storage
, struct sockaddr_in
, struct sockaddr
sin ningún éxito. ¿Algo está mal con este código? ¿Es esta la forma correcta de determinar el origen del paquete?
A continuación, aparece el fragmento de código.
`
/*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);
}
`
¿Está configurando addrLen al tamaño de byte deAddr antes de llamar a recvfrom()? Necesita saber cuántos bytes hay disponibles para rellenar desde Addr con información de pares. En la salida, devolverá la cantidad de bytes completados. –
@Remy: Sí, eso fue todo. –