net.tcp: Verbindungen und Übertragungen

TCP Beschreibt die Ergebnisstruktur, die Teilübertragungs- und Sperrverantwortung.

Wave Foundation

Überprüfen Sie die Verbindungsergebnisse

std::net::tcp
tcp_connect_addr(addr: SocketAddr) -> NetResult<TcpStream>
tcp_bind_loopback(port: u16) -> NetResult<TcpListener>
tcp_accept(listener: TcpListener) -> NetResult<TcpStream>
tcp_read(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_write_all(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_read_exact(stream: TcpStream, buf: ptr<u8>, size: i64) -> i64
tcp_close(stream: TcpStream) -> NetError
tcp_close_listener(listener: TcpListener) -> NetError

Die Verknüpfungsfunktion NetResult<T> hat ok, value und error. Verwenden Sie value nur bei Erfolg. NetError enthält die normalisierte Fehlerklassifizierung und native_code, der Erfolg kann mit error.kind == NET_ERROR_NONE überprüft werden. Diese Konstante stammt aus std::net::error.

Der verbundene Stream und der mit accept empfangene Stream müssen jeweils geschlossen werden. Das Schließen eines Listeners bedeutet nicht, dass alle Streams geschlossen werden, die er bereits akzeptiert hat. Schließen Sie nicht jede Kopie der Struktur.

TCP behält die Nachrichtengrenzen nicht bei

Gehen Sie nicht davon aus, dass Ihnen alles, was Sie einmal geschrieben haben, wieder einfällt, wenn Sie es gelesen haben. Das Protokoll muss durch ein Längenpräfix, ein Trennzeichen oder eine feste Länge begrenzt werden. Feste Längen werden von tcp_read_exact verarbeitet, und Streams unbekannter Länge werden von Leseiterationen und EOF-Verarbeitung verarbeitet.

Negative Zahlen sind Fehler, und bei Lesevorgängen mit positiver Länge ist 0 das Ende des anderen Endes. write_all Einige Daten wurden möglicherweise vor dem Fehler übertragen. Wenn Sie denselben Inhalt von Anfang an erneut übertragen, kann es zu Duplikaten kommen.

Wartezeiten und Fristen

Die Standardfunktion blocking kann lange auf die andere Seite warten. Für Programme, die zeitliche Einschränkungen erfordern, wählen Sie die Serien tcp_connect_addr_timeout, tcp_read_timeout, tcp_write_timeout. Überprüfen Sie den Millisekundenfaktor und die Fehlerfolgen und entwerfen Sie auch eine Route, bei der die Gegenseite nicht reagiert. Asynchron verwendet task zusammen mit dem entsprechenden asynchronen Netzwerk API.

Adresssuche · Lokaler Client abgeschlossen

Kriterien für die Auswahl einer Lesefunktion

Handlungsbedarf Funktion Wert zu überprüfen
Lesen Sie einige der angekommenen Daten tcp_read Negativer Fehler, Nullterminierung, positive Anzahl von Bytes
Lesen Sie eine bestimmte Länge tcp_read_exact Wurde die Anfragelänge vollständig gelesen?
Senden Sie den gegebenen Inhalt bis zum Ende tcp_write_all Anforderungslänge und Rückgabewert
Wartezeitlimit timeout Serie Ergebnis und Fehler zurückgeben timeout

Bei einem Protokoll mit einem vier Byte langen Längenfeld, gefolgt von einem Textkörper, lesen Sie zunächst das vollständige Längenfeld, überprüfen Sie, ob die Länge das zulässige Maximum nicht überschreitet, und weisen Sie dann Platz für den Textkörper zu. Weisen Sie keine großen Speichermengen aus einer vom Peer bereitgestellten, nicht validierten Länge zu.

Wann die Verbindung geschlossen werden soll

Auch wenn die Lesefunktion 0 zurückgibt, bleiben lokale Stream-Ressourcen erhalten. Rufen Sie nach Abschluss der Lektüre tcp_close an. Wenn Sie auch nach einem Übertragungsfehler denselben Bereinigungspfad verwenden, vergessen Sie nicht, den normalen und den fehlgeschlagenen Pfad zu schließen.

Ein Listener ist eine Ressource, die neue Verbindungen empfängt, und ein Stream ist eine Kommunikationsressource, die bereits verbunden ist. Beim Erstellen eines Servers verwalten Sie beide Typen. Jedes Mal, wenn accept erfolgreich ist, wird ein neuer Stream erstellt. Daher schließen wir ihn nach der Verarbeitung und schließen den Listener, wenn die Akzeptanziteration des Servers abgeschlossen ist.

Probieren Sie es selbst aus

Lokale TCP Kundenpraxis enthält den vollständigen Code für den Server und den Client. Sie können zwischen Adresssuche und Verbindungsfehler unterscheiden, indem Sie Fälle vergleichen, in denen der Server zuerst ausgeführt wird, wenn kein Server vorhanden ist und wenn die Portnummer unterschiedlich ist.