sockets - Go 中的 Unix 套接字

标签 sockets go

我正在尝试制作一个使用 Unix 套接字的简单回显客户端和服务器。在此示例中,连接似乎是单向的。服务器可以从客户端接收数据,但不能将数据发回。如果我改用 tcp 连接,它会很好用。有谁知道怎么回事?

服务器

package main

import "net"
import "fmt"

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() {
    l, err := net.Listen("unix", "/tmp/echo.sock")
    if err != nil {
        println("listen error", err.String())
        return
    }

    for {
        fd, err := l.Accept()
        if err != nil {
            println("accept error", err.String())
            return
        }

        go echoServer(fd)
    }
}

客户

package main

import "net"
import "time"

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)
    }
}

最佳答案

在您的示例客户端中,您似乎没有从服务器读取结果。当我添加代码来执行此操作时,我会看到来自服务器的结果。

另外,看看我是如何使用 defer 和 break 来让 reader 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)
    }
}

关于sockets - Go 中的 Unix 套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2886719/

相关文章:

signals - 有没有办法在向进程发送信号后等待?

C# 异步套接字 BeginSend EndReceive

actionscript-3 - Adobe AIR,URLRequest和本地端口

go - 在 thrift 生成的代码中控制 golang 注释

go - -coverprofile 从覆盖百分比中排除未测试的文件

math - 戈朗 : arithmetic operators on structs

go - 是否可以使用 net/http 在 golang 中托管多个域 TLS?

c++ - 使用 C++ 测量跨网络的 2 个应用程序之间的数据传输速率(带宽),如何获得无偏见和准确的结果?

ruby - 如何在 Ruby 中读取 UDP 广播数据报

php - socket_accept 似乎卡在第一个连接上