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
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