加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Unix插槽在Go

发布时间:2020-12-15 19:08:19 所属栏目:安全 来源:网络整理
导读:我试图使一个简单的echo客户端和服务器使用Unix套接字。在这个例子中,连接似乎是单向的。服务器可以从客户端接收数据,但不能发回数据。如果我使用tcp连接,它的效果很好。有人知道有什么问题吗? 服务器 package mainimport "net"import "fmt"func echoSer
我试图使一个简单的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("hin"))
        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)
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读