Чтение 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
}
}
}
}
Другие соображения
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3