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);
}
`
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. –
@Remy: Ja das war es. –