Go の Unix ソケット: 単方向接続の問題
Go で Unix ソケットを使用する場合の一般的な課題の 1 つは、接続が時々次のようになることです。一方向性。一方の当事者はデータを受信できますが、データを送り返すと応答がありません。
原因を特定するためにフォーラムのスレッドに提供されているコード例を分析してみましょう:
サーバー コード:
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) } }
コードを確認すると、クライアントがサーバーから送信された応答を読んでいないことがわかります。これにより、クライアントがサーバーにデータを送信し続けるが応答を受信しないという問題が発生します。
解決策:
この問題を解決するには、クライアントの goroutine を使用して、サーバーからの応答の読み取りを処理します。この変更を加えた後、コードは意図したとおりに動作します:
改訂されたサーバー コード:
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 中国語 Web サイトの他の関連記事を参照してください。