send

Wie sieht's aus?

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

ssize_t send(int s, const void *msg, size_t len, int flags);
    

Was tut's?

Senden :-)
Mit send() versendet man Daten auf einem Socket, der Rückgabewert gibt an, wie viele Bytes versendet wurden. Das muß nicht notwendigerweise soviel sein, wie man versenden wollte! Falls es also irgendwann mal komisch klemmt, das beachten und den Puffer nötigenfalls mit einer Schleife "leersenden". (In der Praxis nimmt der Kernel eigentlich den ganzen Block auf einmal und macht etwaige Aufteilungen selbst)

Wenn man auf einen Socket sendet, der von der Gegenstelle geschlossen wurde, wird das Signal SIGPIPE generiert, das den Prozeß normalerweise tötet, wenn man keinen eigenen Handler installiert hat.

Was machen die Parameter?

Der erste Parameter stellt den Socket dar, auf dem versendet werden soll.

Der zweite Parameter ist ein Zeiger auf einen Speicherbereich, aus dem die Daten entnommen werden (ja, sie sind danach noch drin ;-)).

Der dritte Parameter gibt an, wie viele Daten dort gefunden werden können (bzw. wieviele davon versendet werden sollen, was nicht das gleiche sein muß). Bei Zeichenketten ist das üblicherweise strlen(buffer), nicht sizeof(buffer), um mal einen häufigen Fehler vorwegzunehmen.

Der vierte Parameter ist interessant, aber kann in unseren Fällen getrost auf 0 gesetzt werden. Wer wirklich neugierig ist, kann in die Manpage schauen, oder in mein Socket-Buch (siehe Hauptseite), Kapitel 7.11 bzw. Anhang A.3.

Wie verwende ich es?

int send_banner(int s)
{
    int bytes;
    char banner[] = "Welcome to the Foobar server!\r\n";

    bytes = send(s, banner, strlen(banner), 0);
    if (bytes == -1)
    {
        perror("send() in send_banner() failed");
        return 1;
    }

    return 0;
}