Rumah > pembangunan bahagian belakang > Golang > Mengapa Soket Go Unix Saya Hanya Berkomunikasi Sehala?

Mengapa Soket Go Unix Saya Hanya Berkomunikasi Sehala?

DDD
Lepaskan: 2024-12-01 08:50:22
asal
946 orang telah melayarinya

Why is My Go Unix Socket Only Communicating One Way?

Komunikasi Soket Unix Dwiarah dalam Go

Soket Unix menyediakan mekanisme yang mudah untuk melaksanakan komunikasi antara proses dalam sistem. Dalam Go, operasi rangkaian boleh dilakukan menggunakan pakej bersih. Kadangkala, apabila cuba mewujudkan komunikasi dua hala menggunakan soket Unix, nampaknya hanya satu arah berfungsi.

Salah satu punca yang mungkin untuk tingkah laku ini ialah pengendalian ralat yang tidak mencukupi. Dalam contoh yang diberikan, operasi tulis pelayan kekurangan pengendalian ralat, yang membawa kepada potensi kehilangan data. Dengan menambahkan panik apabila ralat berlaku semasa operasi tulis, kami memastikan bahawa sebarang kehilangan data dapat dilihat dengan serta-merta.

Selain itu, dalam goroutine pelanggan, ketiadaan pengendalian ralat untuk operasi baca menghalang pelanggan daripada menerima sebarang data yang dihantar oleh pelayan. Termasuk pengendalian ralat dan menambah panggilan ke goroutine pembaca yang berasingan untuk mengendalikan data masuk daripada pelayan menyelesaikan isu ini.

Berikut ialah versi diubah suai bagi contoh dengan pengendalian ralat yang diperlukan pelarasan:

Pelayan

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)
    }
}
Salin selepas log masuk

Pelanggan

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)
    }
}
Salin selepas log masuk

Dengan pengubahsuaian ini disediakan, komunikasi dua hala antara klien dan pelayan diwujudkan, membolehkan kedua-dua penghantaran dan menerima data melalui soket Unix.

Atas ialah kandungan terperinci Mengapa Soket Go Unix Saya Hanya Berkomunikasi Sehala?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan