Go TCP 읽기는 비차단입니다: 불완전한 데이터 수신 해결
Go에서 TCP 읽기는 비차단이므로 즉시 반환됩니다. 예상보다 적더라도 사용 가능한 데이터를 사용합니다. 이 동작은 필요한 양의 데이터가 수신될 때까지 기다리는 C의 차단 읽기와 다릅니다.
비차단 읽기 이유
TCP는 바이트 스트림으로 작동합니다. , 전송 중에 조각화될 수 있습니다. 따라서 수신된 바이트 수에만 기초하여 메시지의 끝을 결정하는 것은 불가능합니다. 이를 위해서는 메시지 경계를 결정하는 사용자 정의 구분 기호 또는 기타 메커니즘이 필요합니다.
불완전한 데이터에 대한 솔루션
특정 바이트 수를 읽으려면 io.ReadAtLeast 또는 io.ReadFull을 사용하십시오. . 임의 조건의 경우 오류가 없거나 지정된 조건이 충족될 때까지 읽기 호출을 반복합니다.
예:
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