recvfrom

Wie sieht's aus?

#include <sys/types.h>
#include <sys/socket.h>

ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from,
        socklen_t *fromlen);
    

Was tut's?

Mit recvfrom() empfängt man analog zu recv() Daten von einem Socket, wobei die die Absenderdaten aufgefangen werden (wieder sinnvoll für nicht-verbundene Sockets).

Was machen die Parameter?

Die ersten vier Parameter entsprechen denen von recv()

Bei den letzten beiden Parametern handelt es sich um Ergebnis-Parameter, in denen die Absenderadresse bzw. die Länge der Struktur gespeichert wird. Hier kommt wieder eine struct sockaddr_in{} zum Einsatz, die auf struct sockaddr* gecastet wird. Achtung: fromlen muß mit der Größe der Struktur vorbelegt werden.

Wenn keine Information über den Sender erwünscht ist, können die beiden letzten Parameter NULL bzw. 0 sein.

Anders als bei recv deutet ein Rückgabewert von 0 nicht auf das Beenden einer Verbindung hin! Es handelt sich um ein völlig legitimes, leeres Paket.

Wie verwende ich es?

#define BUF_SIZ	4096    /* Magische Zahlen verhindern */
...
int get_banner_from_localhost(int s)
{
    char buf[BUF_SIZ];
    int bytes;
    struct sockaddr_in addr;

    bytes = recvfrom(s, buf, sizeof(buf) - 1, 0, (struct sockaddr*) &addr, sizeof(addr));
    if (bytes == -1)
    {
        perror("recvfrom() in get_banner() failed");
        return 1;
    }

    buf[bytes] = '\0';

    printf("Server sent \"%s\"\n", buf);

    return 0;
}