|
Beschreibung
Die Funktionen send(), sendto() und sendmsg() senden Nachrichten von einem Socket an einen anderen. send() kann nur bei einem Socket benutzt werden, über den eine Verbindung aufgebaut ist (siehe Funktion connect()). sendto() und sendmsg() können immer verwendet werden.
Der Parameter s bezeichnet den Socket, von dem eine Nachricht gesendet wird. Die Zieladresse wird mit to übergeben, wobei tolen die Größe der Zieladresse angibt.
Die Länge der Nachricht wird mit len angegeben. Wenn die Nachricht zu lang ist, um von der darunter liegenden Protokollebene vollständig transportiert zu werden, wird der Fehler EMSGSIZE geliefert und die Nachricht wird nicht übermittelt.
Der Parameter flags wird zurzeit nicht unterstützt. Ein Wert ungleich 0 führt zu einem Fehler, wobei die Variable errno auf den Wert EOPNOTSUPP gesetzt wird.
Empfängt der Prozess, der send(), sendmsg() oder sendto() aufruft, ein Signal, bevor irgendwelche Daten zum Senden gepuffert wurden, so wird im Standardfall die betreffende Funktion erneut aufgerufen. Nicht erneut aufgerufen wird die Funktion, wenn der aufrufende Prozess mit sigaction() festgelegt hat, diese Funktionsaufrufe zu unterbrechen (siehe Handbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen").
Die Funktion sendmsg() verwendet die Struktur msghdr, um die Anzahl der direkt zu versorgenden Parameter zu verringern. Die Struktur msghdr ist in der Include-Datei <sys/socket.h> wie folgt definiert:
struct msghdr { void *msg_name; /* optionale Adresse */ size_t msg_namelen; /* Länge der Adresse */ struct iovec *msg_iov; /* scatter/gather-Felder */ int msg_iovlen; /* Anzahl der Elemente in msg-iov */ caddr_t msg_accrights /* Zugriffsrechte Senden/Empfangen */ int msg_accrightslen; void *msg_control; /* Hilfsdaten */ size_t msg_controllen; /* Länge des Puffers für Hilfsdaten */ int msg_flags; /* flag für empfangene Nachricht */ };
Die Elemente msg_name und msg_namelen spezifizieren die Zieladresse, wenn der Socket keine aufgebaute Verbindung hat. Für msg_name kann der Null-Zeiger übergeben werden, wenn keine Namen gewünscht oder gefordert werden. Wie Sie dem Socket eine Adresse zuweisen erläutert der Abschnitt "Socket-Adressierung".
Die Elemente msg_iov und msg_iovlen beschreiben die Scatter- und Gather-Felder.
Die Elemente msg_accrights und msg_accrightslen sowie msg_control und msg_controllen werden standardmäßig ignoriert (siehe Inline-Dokumentation in <sys/socket.h> wenn nötig).
Returnwert
≥0:
Bei Erfolg. Der Wert gibt die Anzahl der gesendeten Bytes an.
-1:
Bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen. Die Deskriptormengen werden dann nicht verändert.
Fehler
EBADF
Der Parameter s ist kein gültiger Deskriptor.
ECONNRESET
Die Verbindung zum Partner wurde abgebrochen (nur bei Sockets vom Typ SOCK_STREAM).
EDESTADDRREQ
Der Socket ist nicht verbindungsorientiert, ein fester Partner wurde nicht festgelegt und im Aufruf wurde kein Partner angegeben.
EFAULT
Die Daten sollen in einen nicht vorhandenen oder geschützten Teil des Prozess-Adressbereichs gesendet werden.
EHOSTUNREACH
Der Zielrechner ist nicht erreichbar.
EINTR
Der aufrufende Prozess hat ein Signal empfangen, bevor irgendwelche Daten zum Senden gepuffert werden konnten. Die Einstellung den Funktionsaufruf zu unterbrechen und nicht zu wiederholen ist aktiv.
EINVAL
Ein Parameter spezifiziert einen ungültigen Wert.
EMSGSIZE
Die Nachricht ist zu groß, um auf einmal gesendet zu werden.
ENETDOWN
Die Verbindung zum Netzwerk ist nicht mehr aktiv.
ENOBUFS
Die Ausgabe-Warteschlange für ein Netz-Interface ist voll. Dies führt generell dazu, dass das Interface aufhört zu senden, kann aber auf einem vorübergehenden Stau beruhen.
ENOTCONN
Für den Socket besteht keine Verbindung.
ENOTSOCK
Der Deskriptor s referenziert keinen Socket.
EOPNOTSUPP
Der Parameter flags oder msg->msg_accrights wurde spezifiziert. Dies wird jedoch nicht unterstützt.
EPIPE
Der Socket ist nicht für Schreiben aktiviert, oder der Socket ist verbindungsorientiert und der Partner hat die Verbindung beendet.
Wenn der Socket vom Typ SOCK_STREAM ist, wird das Signal SIGPIPE für den aufrufenden Prozess generiert.
EWOULDBLOCK
Der Socket ist als nicht-blockierend markiert und die geforderte Operation würde blockieren.
EAFNOSUPPORT
Adressen der bei sendto() bzw. sendmsg() angegebenen Adressfamilie können mit diesem Socket nicht verwendet werden.
Wenn AF_UNIX die Adressfamilie des Sockets ist, kann die Ausführung von send(), sendto() und sendmsg() auch aus folgenden Gründen zu einem Fehler führen:
EACCES
Für eine Komponente des Pfadnamens wird die Zugriffsberechtigung verweigert, oder die Berechtigung zum Schreiben auf den angegebenen Socket wird verweigert.
ENAMETOOLONG
Eine Komponente eines Pfadnamens überschreitet NAME_MAX Zeichen, oder der gesamte Pfadname ist länger als PATH_MAX Zeichen.
ENOENT
Eine Komponente des Pfadnamens verweist auf eine nicht vorhandene Datei, oder der Pfadname ist leer.
ENOTDIR
Eine Komponente im Pfadnamen ist kein Verzeichnis.
Siehe auch
connect(), getsockopt(), recv(), socket(), fcntl(), select(), write()