Go での双方向 Unix ソケット通信
Unix ソケットは、システム内でプロセス間通信を実装するための便利なメカニズムを提供します。 Go では、net パッケージを使用してネットワーク操作を実行できます。 Unix ソケットを使用して双方向通信を確立しようとすると、一方向のみが機能しているように見えることがあります。
この動作の考えられる原因の 1 つは、エラー処理が不十分であることです。この例では、サーバーの書き込み操作にエラー処理が欠けており、データ損失の可能性がありました。書き込み操作中にエラーが発生したときにパニックを追加することで、データ損失が即座に明らかになるようにします。
さらに、クライアントのゴルーチン内に読み取り操作のエラー処理がないため、クライアントは受信できませんでした。サーバーから送信されるあらゆるデータ。エラー処理を組み込み、サーバーからの受信データを処理するための別のリーダー ゴルーチンへの呼び出しを追加すると、この問題は解決されます。
これは、必要なエラー処理を備えた例の修正バージョンです。調整:
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 中国語 Web サイトの他の関連記事を参照してください。