ホームページ > バックエンド開発 > Golang > Go Unix ソケットが一方向のみ通信するのはなぜですか?

Go Unix ソケットが一方向のみ通信するのはなぜですか?

DDD
リリース: 2024-12-01 08:50:22
オリジナル
945 人が閲覧しました

Why is My Go Unix Socket Only Communicating One Way?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート