La lecture TCP Go n'est pas bloquante : résoudre la réception de données incomplètes
En Go, les lectures TCP ne sont pas bloquantes, ce qui signifie qu'elles reviennent immédiatement avec toutes les données disponibles, même si elles sont inférieures aux attentes. Ce comportement diffère des lectures bloquantes du C, qui attendent que la quantité requise de données soit reçue.
Raison de la lecture non bloquante
TCP fonctionne comme un flux d'octets , qui peut être fragmenté lors de la transmission. Il est donc impossible de déterminer la fin d’un message uniquement en fonction du nombre d’octets reçus. Cela nécessite des délimiteurs personnalisés ou d'autres mécanismes pour déterminer les limites des messages.
Solution aux données incomplètes
Pour lire un nombre spécifique d'octets, utilisez io.ReadAtLeast ou io.ReadFull . Pour des conditions arbitraires, effectuez une boucle sur l'appel Read jusqu'à ce qu'il n'y ait plus d'erreur ou que la condition spécifiée soit remplie.
Exemple :
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
}
}
}
}
Autres considérations
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3