2010-06-08 25 views
6

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

` 
+3

¿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. –

+0

@Remy: Sí, eso fue todo. –

Respuesta

17

Debe inicializar addrLen-sizeof fromAddr antes de llamar recvfrom() - es un parámetro de entrada/salida. El uso de struct sockaddr_storage para declarar fromAddr es correcto.

+0

Gracias fue eso. Tonto de mí. –

0

que tenían el mismo problema:

Invalid arguments 'Candidates are: int recvfrom(int, void *, unsigned int, int, 
        sockaddr *, unsigned int *) ' 

en mismo código:

recvfrom(sockFd, buffer, MAX_PKTSZ, 0, (struct sockaddr*)&fromAddr, &addrLen) 

Mi error fue que yo solía tipo ordinario int en lugar de unsigned int para addrLen:

unsigned int addrLen; 
addrLen = sizeof(fromAddr); 
Cuestiones relacionadas