«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как обрабатывать неполный прием данных при неблокирующем чтении TCP в Go?

Как обрабатывать неполный прием данных при неблокирующем чтении TCP в Go?

Опубликовано 8 ноября 2024 г.
Просматривать:835

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

Чтение TCP в Go неблокируется: устранение неполного приема данных

В Go чтения TCP неблокируются, то есть возвращаются немедленно с любыми доступными данными, даже если они меньше ожидаемых. Такое поведение отличается от блокирующего чтения в C, которое ожидает получения необходимого объема данных.

Причина неблокирующего чтения

TCP работает как поток байтов , который может быть фрагментирован во время передачи. Следовательно, невозможно определить конец сообщения, основываясь только на количестве полученных байтов. Для этого требуются специальные разделители или другие механизмы для определения границ сообщения.

Решение проблемы с неполными данными

Чтобы прочитать определенное количество байтов, используйте io.ReadAtLeast или io.ReadFull . Для произвольных условий выполняйте цикл вызова Read до тех пор, пока не будет устранена ошибка или не будет выполнено указанное условие.

Пример:

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

Другие соображения

  • Учитывайте возможность использования нескольких пакетов за одну запись.
  • Используйте разделители или другие методы для определения границ сообщения .
  • Рассмотрите возможность использования net/textproto для текстовых протоколов.
  • Внедрите тайм-ауты или сроки, чтобы предотвратить нехватку ресурсов.
  • Проверьте все ошибки сетевых операций, чтобы избежать проблем с маскированием.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3