Maison  >  Article  >  développement back-end  >  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 ?

DDD
DDDoriginal
2024-11-04 16:05:02603parcourir

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é de données requise 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 :

<code class="go">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
            }
        }
    }
}</code>

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 le texte -protocoles basés sur.
  • Implémentez des délais d'attente ou des délais pour éviter la pénurie de ressources.
  • Examinez toutes les erreurs des opérations réseau pour éviter les problèmes de masquage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn