Go의 양방향 Unix 소켓 통신
Unix 소켓은 시스템 내에서 프로세스 간 통신을 구현하기 위한 편리한 메커니즘을 제공합니다. Go에서는 net 패키지를 사용하여 네트워킹 작업을 수행할 수 있습니다. 때때로 Unix 소켓을 사용하여 양방향 통신을 설정하려고 할 때 한 방향만 작동하는 것처럼 보일 수 있습니다.
이 동작의 가능한 원인 중 하나는 오류 처리가 충분하지 않기 때문입니다. 주어진 예에서 서버의 쓰기 작업에는 오류 처리가 부족하여 잠재적인 데이터 손실이 발생했습니다. 쓰기 작업 중 오류가 발생할 때 패닉을 추가함으로써 모든 데이터 손실이 즉시 눈에 띄게 됩니다.
또한 클라이언트의 고루틴 내에서 읽기 작업에 대한 오류 처리가 없어 클라이언트가 데이터 손실을 수신할 수 없었습니다. 서버에서 보낸 모든 데이터. 오류 처리를 포함하고 서버에서 들어오는 데이터를 처리하기 위해 별도의 리더 고루틴에 대한 호출을 추가하면 이 문제가 해결됩니다.
다음은 필요한 오류 처리 기능을 갖춘 수정된 예시 버전입니다. 조정:
package main import ( "log" "net" ) 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 main() { l, err := net.Listen("unix", "/tmp/echo.sock") if err != nil { log.Fatal("listen error:", err) } for { fd, err := l.Accept() if err != nil { log.Fatal("accept error:", err) } go echoServer(fd) } }
package main import ( "io" "log" "net" "time" ) 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) } }
이러한 수정 사항을 적용하면, 클라이언트와 서버 간의 양방향 통신이 설정되어 Unix를 통해 데이터를 보내고 받을 수 있습니다. 소켓.
위 내용은 Go Unix 소켓이 단방향으로만 통신하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!