"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment gérer la réception de données incomplètes dans les lectures TCP non bloquantes de Go ?

Comment gérer la réception de données incomplètes dans les lectures TCP non bloquantes de Go ?

Publié le 2024-11-08
Parcourir:516

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

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

  • Gérez la possibilité de plusieurs paquets pour une seule écriture.
  • Utilisez des délimiteurs ou d'autres méthodes pour définir les limites des messages .
  • Envisagez d'utiliser net/textproto pour les protocoles basés sur du texte.
  • Implémentez des délais d'attente ou des délais pour empêcher les ressources famine.
  • Examinez toutes les erreurs des opérations réseau pour éviter les problèmes de masquage.
Dernier tutoriel Plus>

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