Go에서 Unix 소켓을 구현할 때 클라이언트와 서버가 모두 데이터를 주고받을 수 있도록 양방향 통신 채널을 구축하는 것이 필수적입니다. . 이 문서에서는 Unix 소켓을 사용할 때 발생하는 근본적인 문제, 즉 단방향 연결로 인해 한 방향으로만 데이터가 전송되는 문제를 살펴봅니다.
제공된 코드 예제에서 서버는 다음에서 데이터를 받을 수 있습니다. 클라이언트는 데이터로 응답하지 않습니다. 이 문제는 클라이언트 코드의 c.Read() 호출 뒤에 c.Write() 호출이 뒤따르지 않는다는 사실에서 비롯됩니다. 결과적으로 클라이언트는 서버의 응답을 읽지 못하여 단방향 연결이라는 착각을 불러일으킵니다.
양방향 통신을 설정하려면 클라이언트와 서버를 모두 수정해야 합니다. code.
수정된 서버 코드에는 만약의 경우에 대비하여 연결 종료를 적절하게 처리하기 위한 defer 문이 도입되었습니다. 오류의. 또한 필요한 경우 break를 활용하여 리더 고루틴을 종료합니다.
package main import ( "log" "net" ) func echoServer(c net.Conn) { defer c.Close() 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) } }
수정된 클라이언트 코드는 서버에서 들어오는 데이터를 지속적으로 읽을 수 있도록 리더 고루틴을 추가합니다. defer 문은 기본 기능 종료 시 연결이 닫히도록 보장합니다.
package main import ( "io" "log" "net" "time" ) func reader(r io.Reader) { defer r.(net.Conn).Close() // Ensure connection is closed even on panic 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 { log.Fatal(err) } go reader(c) for { _, err := c.Write([]byte("hi")) if err != nil { log.Fatal(err) break } time.Sleep(1e9) } }
이러한 수정을 통해 클라이언트-서버 통신은 양방향이 되어 양측이 원활하게 데이터를 보내고 받을 수 있습니다.
위 내용은 Go에서 Unix 소켓과 양방향 통신을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!