> 백엔드 개발 > Golang > Go Unix 소켓 연결이 단방향인 이유는 무엇이며 어떻게 해결할 수 있습니까?

Go Unix 소켓 연결이 단방향인 이유는 무엇이며 어떻게 해결할 수 있습니까?

Linda Hamilton
풀어 주다: 2024-12-08 06:28:15
원래의
632명이 탐색했습니다.

Why is my Go Unix Socket Connection Unidirectional, and How Can I Fix It?

Go의 Unix 소켓: 단방향 연결 문제

Go에서 Unix 소켓을 사용할 때 흔히 발생하는 문제 중 하나는 연결이 때때로 끊어질 수 있다는 것입니다. 단방향. 한 쪽에서 데이터를 수신할 수 있지만 데이터를 다시 보내면 응답이 없습니다.

원인을 식별하기 위해 포럼 스레드에 제공된 코드 예제를 분석해 보겠습니다.

서버 코드:

func echoServer(c net.Conn) {
    for {
        buf := make([]byte, 512)
        nr, err := c.Read(buf)
        if err != nil {
            return
        }

        data := buf[0:nr]
        fmt.Printf("Received: %v", string(data))
        _, err = c.Write(data)
        if err != nil {
            panic("Write: " + err.String())
        }
    }
}
로그인 후 복사

클라이언트 코드:

func main() {
    c,err := net.Dial("unix","", "/tmp/echo.sock")
    if err != nil {
        panic(err.String())
    }
    for {
        _,err := c.Write([]byte("hi\n"))
        if err != nil {
            println(err.String())
        }
        time.Sleep(1e9)
    }
}
로그인 후 복사

코드를 검토한 결과 클라이언트가 서버에서 보낸 응답을 읽지 않는 것으로 나타났습니다. 이로 인해 클라이언트가 서버에 계속 데이터를 보내지만 응답을 받지 못하는 문제가 발생합니다.

해결책:

이 문제를 해결하려면 클라이언트의 고루틴은 서버로부터의 응답 읽기를 처리합니다. 이렇게 수정하면 코드가 의도한 대로 작동합니다.

수정된 서버 코드:

func echoServer(c net.Conn) {
    for {
        buf := make([]byte, 512)
        nr, err := c.Read(buf)
        if err != nil {
            return
        }

        data := buf[0:nr]
        println("Server got:", string(data))
        _, err = c.Write(data)
        if err != nil {
            log.Fatal("Write: ", err)
        }
    }
}
로그인 후 복사

수정된 클라이언트 코드:

func reader(r io.Reader) {
    buf := make([]byte, 1024)
    for {
        n, err := r.Read(buf[:])
        if err != nil {
            return
        }
        println("Client got:", string(buf[0:n]))
    }
}

func main() {
    c, err := net.Dial("unix", "/tmp/echo.sock")
    if err != nil {
        panic(err)
    }
    defer c.Close()

    go reader(c)
    for {
        _, err := c.Write([]byte("hi"))
        if err != nil {
            log.Fatal("write error:", err)
            break
        }
        time.Sleep(1e9)
    }
}
로그인 후 복사

이러한 변경을 통해 서버는 클라이언트로부터 데이터를 수신하고 응답을 다시 보낼 수도 있습니다. 양방향 소통채널.

위 내용은 Go Unix 소켓 연결이 단방향인 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿