Nach der erfolgreichen Konfiguration eines Sockets kann eine Netzwerk-kommunikation, das Senden und Empfangen von Daten, stattfinden. Die Funktionalitäten, die dafür benötigt werden, werden von der Socket Interface API bereitgestellt.
Für das Senden von Daten durch den Socket werden die folgenden fünf Funktionen von Berkeley Socket bereitgestellt:
* send: Die Funktion ist für die Datenübertragung durch ein verbindungsorientierten Socket. Mit speziellen Flags kann das Verhalten des Sockets gesteuert werden.
* wirte: Diese Funktion ist für die Datenübertragung durch einen verbindungsorientierten Sockets unter Verwendung eines einfachen Datenpuffers.
* writev: Diese Funktion ist für die Datenübertragung durch einen verbindungs-orientierten Socket, unter Verwendung nicht zusammenhängender Speicherbereiche als Datenpuffer.
* sebdto: Diese Funktion dient der Datenübertragung durch einen verbindungs-freien Socket, unter Verwendung eines einfachen Datenpuffers.
*sendmsg: Diese Funktion ist für die Datenübertragung durch einen verbindungsfreien Socket, unter Verwendung einer flexiblen Nachrichtenstruktur als Nachrichtenpuffer, verantwortlich.
Wie auch bei der connect-Funktion beschrieben, benötigt eine Funktion, die für eine verbindungsorientierte Datenübertragung verwendet wird, keine Zieladresse als Funktionsparameter. Die benötigten Informationen zum entfernten Host sind nach der Verwendung der connect-Funktion in der Socket-Datenstruktur eingetragen. Die Socket-Implementation verwaltet während der gesamten Konversation die Adreßinformation und das Interface zur Transportschicht für die Verbindung zum Socket.
Die Funktionen, die bei einem verbindungsorientierten Socket für die Datenübertragung benutzt werden, sind send, write und writev, wie auch an dem Fehlen eines Parameters für die Zieladresse zu sehen ist.
Beispiele für typische Funktionsaufrufe:
ergebnis = write(socket_handle, nachrichten_puffer, puffer_laenge);
Der Socket Handle bestimmt den Eintrag in der Descriptortabelle, der auf die interne Socket-Datenstruktur zeigt.
Der zweite Parameter ist ein Zeiger auf einen Datenpuffer, der die zu übertragenden Informationen enthält.
Der dritte Parameter gibt die Datenpufferlänge an und verhindert somit einen Zugriff auf undefinierte Speicherbereich durch die Funktion.
ergebnis = writev(socket_handle, io_vektor, vektor_laenge);
Des weiteren wird mit dem ersten Parameter der Socket Handle übergeben, der die gleiche Aufgabe hat wie bei der Funktion write.
Der zweite Parameter ist die Adresse eines Feldes, das eine Reihe von Zeigern enthält. Die Zeiger verweisen auf Datenblöcke, die die zu übertragenden Datenblöcke bilden. Jedem Zeiger wird durch die Socket API ein Längenwert zugewiesen, der die Anzahl der zu übertragenden Datenbytes bestimmt.
Der dritte Parameter gibt die Anzahl der Felder an.
ergebnis = send(socket_handle, nachrichten_puffer, puffer_laenge, flags);
Der einzige Unterschied zwischen der write-Funktion und der send-Funktion ist der zusätzliche Parameter zur Angabe von Flags, die die Übertragung steuern.
Alle drei Funktionen geben einen Integerwert zurück, der der Anzahl der übertragenen Bytes durch den Socket entspricht. Bei einem Fehlschlag der Funktion wird eine -1 zurückgegeben.