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

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

DDD
DDD원래의
2024-11-04 16:05:02537검색

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

Go TCP 읽기는 비차단입니다: 불완전한 데이터 수신 해결

Go에서 TCP 읽기는 비차단이므로 즉시 반환됩니다. 예상보다 적더라도 사용 가능한 데이터를 사용합니다. 이 동작은 필요한 양의 데이터가 수신될 때까지 기다리는 C의 차단 읽기와 다릅니다.

비차단 읽기 이유

TCP는 바이트 스트림으로 작동합니다. , 전송 중에 조각화될 수 있습니다. 따라서 수신된 바이트 수에만 기초하여 메시지의 끝을 결정하는 것은 불가능합니다. 이를 위해서는 메시지 경계를 결정하는 사용자 정의 구분 기호 또는 기타 메커니즘이 필요합니다.

불완전한 데이터에 대한 솔루션

특정 바이트 수를 읽으려면 io.ReadAtLeast 또는 io.ReadFull을 사용하세요. . 임의 조건의 경우 오류가 없거나 지정된 조건이 충족될 때까지 읽기 호출을 반복합니다.

예:

<code class="go">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
            }
        }
    }
}</code>

기타 고려 사항

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

위 내용은 Go\의 비차단 TCP 읽기에서 불완전한 데이터 수신을 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.