首頁 > 後端開發 > Golang > 為什麼我的 Go Unix Socket 連線是單向的,如何修復?

為什麼我的 Go Unix Socket 連線是單向的,如何修復?

Linda Hamilton
發布: 2024-12-08 06:28:15
原創
613 人瀏覽過

Why is my Go Unix Socket Connection Unidirectional, and How Can I Fix It?

Go 中的Unix 套接字:單向連接問題

在Go 中使用Unix 套接字時的一個常見挑戰是連接有時可能會變成單向。雖然一方可以接收數據,但發送回數據會導致無響應。

讓我們分析一下論壇貼文中提供的程式碼範例來確定原因:

伺服器程式碼:

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 Socket 連線是單向的,如何修復?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板