Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unix Sockets in Go

Tags:

go

sockets

I'm trying to make a simple echo client and server that uses Unix sockets. In this example, the connection seems to be unidirectional. The server can receive data from the client, but it can't send the data back. If I use tcp connections instead, it works great. Does anyone know what's wrong?

Server

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

Client

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)     } } 
like image 728
marketer Avatar asked May 22 '10 02:05

marketer


1 Answers

In your example client, you don't seem to be reading the result from the server. When I add code to do that, I see the results from the server.

Also, take a look at how I used defer and break to make the reader goroutine exit.

Server

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

Client

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)     } } 
like image 168
Jeff Allen Avatar answered Oct 12 '22 08:10

Jeff Allen