首页 > 后端开发 > Golang > 为什么我的 Go Unix Socket 只能以一种方式通信?

为什么我的 Go Unix Socket 只能以一种方式通信?

DDD
发布: 2024-12-01 08:50:22
原创
827 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板