„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie gehe ich mit unvollständigem Datenempfang bei nicht blockierenden TCP-Lesevorgängen von Go um?

Wie gehe ich mit unvollständigem Datenempfang bei nicht blockierenden TCP-Lesevorgängen von Go um?

Veröffentlicht am 08.11.2024
Durchsuche:526

How to Handle Incomplete Data Reception in Go\'s Non-Blocking TCP Reads?

Go TCP Read ist nicht blockierend: Adressierung unvollständiger Datenempfang

In Go sind TCP Reads nicht blockierend, was bedeutet, dass sie sofort zurückgegeben werden mit allen verfügbaren Daten, auch wenn diese geringer sind als erwartet. Dieses Verhalten unterscheidet sich von den blockierenden Lesevorgängen von C, die warten, bis die erforderliche Datenmenge empfangen wurde.

Grund für nicht blockierendes Lesen

TCP arbeitet als Bytestrom , die während der Übertragung fragmentiert werden kann. Daher ist es unmöglich, das Ende einer Nachricht allein anhand der Anzahl der empfangenen Bytes zu bestimmen. Dies erfordert benutzerdefinierte Trennzeichen oder andere Mechanismen, um Nachrichtengrenzen zu bestimmen.

Lösung für unvollständige Daten

Um eine bestimmte Anzahl von Bytes zu lesen, verwenden Sie io.ReadAtLeast oder io.ReadFull . Führen Sie für beliebige Bedingungen eine Schleife beim Leseaufruf durch, bis kein Fehler mehr vorliegt oder die angegebene Bedingung erfüllt ist.

Beispiel:

package main

import (
    "fmt"
    "net"
    "time"
)

func main() {
    conn, _ := net.Dial("tcp", "127.0.0.1:4243")

    // Set a deadline to prevent hanging reads
    _ = conn.SetReadDeadline(time.Now().Add(10 * time.Second))

    // Loop to read until a newline is encountered
    for {
        buf := make([]byte, 512)
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println(err)
            break
        }
        if n > 0 {
            str := string(buf[:n])
            if str[len(str)-1] == '\n' {
                fmt.Println(str)
                break
            }
        }
    }
}

Andere Überlegungen

  • Behandeln Sie die Möglichkeit mehrerer Pakete für einen einzelnen Schreibvorgang.
  • Verwenden Sie Trennzeichen oder andere Methoden, um Nachrichtengrenzen zu definieren .
  • Erwägen Sie die Verwendung von net/textproto für textbasierte Protokolle.
  • Implementieren Sie Zeitüberschreitungen oder Fristen, um Ressourcenknappheit zu verhindern.
  • Überprüfen Sie alle Fehler aus Netzwerkvorgängen, um Maskierungsprobleme zu vermeiden.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3