"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar la recepción de datos incompletos en las lecturas TCP sin bloqueo de Go?

¿Cómo manejar la recepción de datos incompletos en las lecturas TCP sin bloqueo de Go?

Publicado el 2024-11-08
Navegar:717

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

La lectura de TCP de Go no es bloqueante: abordar la recepción de datos incompletos

En Go, las lecturas de TCP no son de bloqueo, lo que significa que regresan inmediatamente con cualquier dato disponible, incluso si es menor de lo esperado. Este comportamiento difiere de las lecturas de bloqueo de C, que esperan hasta que se recibe la cantidad requerida de datos.

Motivo de la lectura sin bloqueo

TCP opera como un flujo de bytes , que puede fragmentarse durante la transmisión. Por lo tanto, es imposible determinar el final de un mensaje basándose únicamente en la cantidad de bytes recibidos. Esto requiere delimitadores personalizados u otros mecanismos para determinar los límites de los mensajes.

Solución para datos incompletos

Para leer una cantidad específica de bytes, use io.ReadAtLeast o io.ReadFull . Para condiciones arbitrarias, realice un bucle en la llamada de lectura hasta que no haya ningún error o se cumpla la condición especificada.

Ejemplo:

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

Otras consideraciones

  • Manejar la posibilidad de múltiples paquetes para una sola escritura.
  • Utilizar delimitadores u otros métodos para definir los límites de los mensajes .
  • Considere usar net/textproto para protocolos basados ​​en texto.
  • Implemente tiempos de espera o fechas límite para evitar la escasez de recursos.
  • Revise todos los errores de las operaciones de red para evitar problemas de enmascaramiento.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3