Heim > Backend-Entwicklung > Golang > Warum ist meine Go-Unix-Socket-Verbindung unidirektional und wie kann ich das beheben?

Warum ist meine Go-Unix-Socket-Verbindung unidirektional und wie kann ich das beheben?

Linda Hamilton
Freigeben: 2024-12-08 06:28:15
Original
618 Leute haben es durchsucht

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

Unix-Sockets in Go: Ein unidirektionales Verbindungsproblem

Eine häufige Herausforderung bei der Arbeit mit Unix-Sockets in Go besteht darin, dass die Verbindung manchmal unterbrochen werden kann unidirektional. Während Daten von einer Partei empfangen werden können, führt das Zurücksenden von Daten zu keiner Antwort.

Lassen Sie uns ein Codebeispiel in einem Forenthread analysieren, um die Ursache zu identifizieren:

Servercode:

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())
        }
    }
}
Nach dem Login kopieren

Kunde Code:

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)
    }
}
Nach dem Login kopieren

Beim Überprüfen des Codes stellen wir fest, dass der Client die vom Server gesendete Antwort nicht liest. Dies verursacht ein Problem, bei dem der Client weiterhin Daten an den Server sendet, aber nie eine Antwort erhält.

Lösung:

Um dieses Problem zu beheben, müssen wir eine hinzufügen Goroutine im Client, um das Lesen der Antwort vom Server zu übernehmen. Nach dieser Änderung funktioniert der Code wie vorgesehen:

Überarbeiteter Servercode:

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)
        }
    }
}
Nach dem Login kopieren

Überarbeiteter Client-Code:

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)
    }
}
Nach dem Login kopieren

Mit diesen Änderungen kann der Server Daten vom Client empfangen und auch Antworten zurücksenden, was zu einer bidirektionalen Kommunikation führt Kanal.

Das obige ist der detaillierte Inhalt vonWarum ist meine Go-Unix-Socket-Verbindung unidirektional und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage