2010-06-08 3 views
6

Ich schreibe gerade ein kleines UDP-Serverprogramm in Linux. Der UDP-Server empfängt Pakete von zwei verschiedenen Peers und führt verschiedene Operationen basierend darauf durch, von welchem ​​Peer er das Paket empfangen hat. Ich versuche herauszufinden, woher ich das Paket bekomme. Wenn select jedoch zurückgibt und wenn recvfrom aufgerufen wird, wird es mit einem Fehler von Ungültiges Argument zurückgegeben. Wenn ich als vorletzte Argumente NULL übergebe, ist recvfrom erfolgreich.recvfrom gibt ungültiges Argument zurück, wenn * von * übergeben wird

Ich habe versucht, von Addr als struct sockaddr_storage, struct sockaddr_in, struct sockaddr zu deklarieren, ohne Erfolg. Ist ihr etwas falsch mit diesem Code? Ist dies der richtige Weg, um die Quelle des Pakets zu bestimmen?

Das Code-Snippet folgt.

`   
    /*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

Setzen Sie addrLen auf die Bytegröße von fromAddr vor dem Aufruf von recvfrom()? Es muss wissen, wie viele Bytes verfügbar sind, damit es von Addr mit Peer-Informationen ausfüllen kann. Bei der Ausgabe wird die Anzahl der aufgefüllten Bytes zurückgegeben. –

+0

@Remy: Ja das war es. –

Antwort

17

Sie müssen addrLen-sizeof fromAddr initialisieren, bevor recvfrom() Aufruf - es ist ein Ein-/Ausgabeparameter. Die Verwendung von struct sockaddr_storage zur Deklaration fromAddr ist korrekt.

+0

Danke das war es. Wie dumm von mir. –

0

hatte ich das gleiche Problem:

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

in gleichem Code:

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

war mein Fehler, dass ich gewöhnliche int Art statt unsigned int für verwendet addrLen:

unsigned int addrLen; 
addrLen = sizeof(fromAddr); 
Verwandte Themen