微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Unix插槽在Go

我试图使一个简单的echo客户端和服务器使用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)
    }
}
在您的示例客户端中,您似乎没有从服务器读取结果。当我添加代码来做到这一点,我看到服务器的结果。

另外,看看我如何使用延迟和休息使读者goroutine退出

服务器

package main

import (
    "log"
    "net"
)

func echoServer(c net.Conn) {
    for {
        buf := make([]byte,err := c.Read(buf)
        if err != nil {
            return
        }

        data := buf[0:nr]
        println("Server got:",err = c.Write(data)
        if err != nil {
            log.Fatal("Write: ",err)
        }
    }
}

func main() {
    l,"/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,"/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)
    }
}

原文地址:https://www.jb51.cc/bash/387435.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐