Unix插槽在Go

前端之家收集整理的这篇文章主要介绍了Unix插槽在Go前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图使一个简单的echo客户端和服务器使用Unix套接字。在这个例子中,连接似乎是单向的。服务器可以从客户端接收数据,但不能发回数据。如果我使用tcp连接,它的效果很好。有人知道有什么问题吗?

服务器

  1. package main
  2.  
  3. import "net"
  4. import "fmt"
  5.  
  6. func echoServer(c net.Conn) {
  7. for {
  8. buf := make([]byte,512)
  9. nr,err := c.Read(buf)
  10. if err != nil {
  11. return
  12. }
  13.  
  14. data := buf[0:nr]
  15. fmt.Printf("Received: %v",string(data))
  16. _,err = c.Write(data)
  17. if err != nil {
  18. panic("Write: " + err.String())
  19. }
  20. }
  21. }
  22.  
  23. func main() {
  24. l,err := net.Listen("unix","/tmp/echo.sock")
  25. if err != nil {
  26. println("listen error",err.String())
  27. return
  28. }
  29.  
  30. for {
  31. fd,err := l.Accept()
  32. if err != nil {
  33. println("accept error",err.String())
  34. return
  35. }
  36.  
  37. go echoServer(fd)
  38. }
  39. }

客户

  1. package main
  2.  
  3. import "net"
  4. import "time"
  5.  
  6. func main() {
  7. c,err := net.Dial("unix","","/tmp/echo.sock")
  8. if err != nil {
  9. panic(err.String())
  10. }
  11. for {
  12. _,err := c.Write([]byte("hi\n"))
  13. if err != nil {
  14. println(err.String())
  15. }
  16. time.Sleep(1e9)
  17. }
  18. }
在您的示例客户端中,您似乎没有从服务器读取结果。当我添加代码来做到这一点,我看到服务器的结果。

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

服务器

  1. package main
  2.  
  3. import (
  4. "log"
  5. "net"
  6. )
  7.  
  8. func echoServer(c net.Conn) {
  9. for {
  10. buf := make([]byte,err := c.Read(buf)
  11. if err != nil {
  12. return
  13. }
  14.  
  15. data := buf[0:nr]
  16. println("Server got:",err = c.Write(data)
  17. if err != nil {
  18. log.Fatal("Write: ",err)
  19. }
  20. }
  21. }
  22.  
  23. func main() {
  24. l,"/tmp/echo.sock")
  25. if err != nil {
  26. log.Fatal("listen error:",err)
  27. }
  28.  
  29. for {
  30. fd,err := l.Accept()
  31. if err != nil {
  32. log.Fatal("accept error:",err)
  33. }
  34.  
  35. go echoServer(fd)
  36. }
  37. }

客户

  1. package main
  2.  
  3. import (
  4. "io"
  5. "log"
  6. "net"
  7. "time"
  8. )
  9.  
  10. func reader(r io.Reader) {
  11. buf := make([]byte,1024)
  12. for {
  13. n,err := r.Read(buf[:])
  14. if err != nil {
  15. return
  16. }
  17. println("Client got:",string(buf[0:n]))
  18. }
  19. }
  20.  
  21. func main() {
  22. c,"/tmp/echo.sock")
  23. if err != nil {
  24. panic(err)
  25. }
  26. defer c.Close()
  27.  
  28. go reader(c)
  29. for {
  30. _,err := c.Write([]byte("hi"))
  31. if err != nil {
  32. log.Fatal("write error:",err)
  33. break
  34. }
  35. time.Sleep(1e9)
  36. }
  37. }

猜你在找的Bash相关文章