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 중국어 웹사이트의 기타 관련 기사를 참조하세요!