"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go\의 비차단 TCP 읽기에서 불완전한 데이터 수신을 처리하는 방법은 무엇입니까?

Go\의 비차단 TCP 읽기에서 불완전한 데이터 수신을 처리하는 방법은 무엇입니까?

2024-11-08에 게시됨
검색:256

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

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

기타 고려 사항

  • 한 번의 쓰기에 대해 여러 패킷의 가능성을 처리합니다.
  • 구분 기호 또는 기타 방법을 사용하여 메시지 경계를 정의합니다. .
  • 텍스트 기반 프로토콜에는 net/textproto 사용을 고려하세요.
  • 리소스 부족을 방지하려면 시간 초과 또는 기한을 구현하세요.
  • 마스킹 문제를 방지하려면 네트워크 작업의 모든 오류를 검토하세요.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3