首頁 >後端開發 >Golang >為什麼我的 Go Unix Socket 只能以一種方式通訊?

為什麼我的 Go Unix Socket 只能以一種方式通訊?

DDD
DDD原創
2024-12-01 08:50:22841瀏覽

Why is My Go Unix Socket Only Communicating One Way?

Go 中的雙向 Unix Socket 通訊

Unix 套接字提供了一種在系統內實現進程間通訊的便捷機制。在 Go 中,可以使用 net 套件執行網路操作。有時,當嘗試使用 Unix 套接字建立雙向通訊時,可能會出現只有一個方向在運作的情況。

導致此行為的一個可能原因是錯誤處理不足。在給定的範例中,伺服器的寫入操作缺乏錯誤處理,導致潛在的資料遺失。透過在寫入操作期間發生錯誤時添加恐慌,我們確保任何資料遺失都會立即顯現出來。

此外,在客戶端的 goroutine 中,缺乏對讀取操作的錯誤處理,導致客戶端無法接收伺服器發送的任何資料。包括錯誤處理並添加對單獨的讀取器 goroutine 的呼叫來處理來自伺服器的傳入資料可以解決此問題。

這是範例的修改版本,其中包含必要的錯誤處理調整:

伺服器

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 Socket 只能以一種方式通訊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn