recv

Wie sieht's aus?

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

ssize_t recv(int s, void *buf, size_t len, int flags);
    

Was tut's?

Mit recv() empfängt man Daten von einem Socket. Der Rückgabewert zeigt an, wie viele Bytes man empfangen hat. Achtung: recv() kann natürlich, wie alle anderen I/O-Operationen, blockieren, wenn keine Daten zum Lesen da sind. In diesem Fall wird solange gewartet, bis welche vorhanden sind. Um dies zu verhindern kann man select() verwenden.

Kehrt recv() zurück, aber hat 0 Bytes gelesen, wurde der Socket auf der Gegenseite geschlossen.

Was machen die Parameter?

Der erste Parameter bezeichnet den Socket, von dem die Daten gelesen werden sollen.

Der zweite Parameter zeigt auf einen Speicherbereich, in dem sie gespeichert werden können. Er muß selbstverständlich beschreibbar sein, und mindestens len Bytes lang sein.

Der dritte Parameter gibt die Anzahl der zu lesenden Bytes an. Ist dies mehr, als vorhanden sind, so kehrt recv mit weniger als len Bytes zurück!

Der vierte Parameter entspricht dem vierten Parameter von send() und soll hier nicht weiter beachtet, also mit 0 belegt werden.

Wie verwende ich es?

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

    bytes = recv(s, buf, sizeof(buf) - 1, 0);
    if (bytes == -1)
    {
        perror("recv() in get_banner() failed");
        return 1;
    }

    buf[bytes] = '\0';

    printf("Banner is \"%s\"\n", buf);

    return 0;
}