"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como lidar com a recepção de dados incompleta em leituras TCP sem bloqueio do Go?

Como lidar com a recepção de dados incompleta em leituras TCP sem bloqueio do Go?

Publicado em 2024-11-08
Navegar:345

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

Go TCP Read não é bloqueador: abordando recepção de dados incompleta

No Go, as leituras TCP não são bloqueadoras, o que significa que retornam imediatamente com quaisquer dados disponíveis, mesmo que sejam inferiores ao esperado. Esse comportamento difere das leituras de bloqueio de C, que esperam até que a quantidade necessária de dados seja recebida.

Motivo para leitura sem bloqueio

TCP opera como um fluxo de bytes , que pode ser fragmentado durante a transmissão. Portanto, é impossível determinar o final de uma mensagem baseado apenas no número de bytes recebidos. Isso requer delimitadores personalizados ou outros mecanismos para determinar os limites da mensagem.

Solução para dados incompletos

Para ler um número específico de bytes, use io.ReadAtLeast ou io.ReadFull . Para condições arbitrárias, faça um loop na chamada Read até que não haja nenhum erro ou a condição especificada seja atendida.

Exemplo:

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

Outras considerações

  • Trate da possibilidade de vários pacotes para uma única gravação.
  • Use delimitadores ou outros métodos para definir limites de mensagens .
  • Considere usar net/textproto para protocolos baseados em texto.
  • Implemente tempos limite ou prazos para evitar falta de recursos.
  • Revise todos os erros das operações de rede para evitar problemas de mascaramento.
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3