Skip to content

Instantly share code, notes, and snippets.

@szaydel
Created August 28, 2014 13:25
Show Gist options
  • Save szaydel/423d89bc9fe11d85d332 to your computer and use it in GitHub Desktop.
Save szaydel/423d89bc9fe11d85d332 to your computer and use it in GitHub Desktop.
Example of Creating Socket Server and Client using Go's Stdlib

Unix domain socket server and client There are three types of unix domain socket.

"unix" corresponds to SOCK_STREAM "unixdomain" corresponds to SOCK_DGRAM "unixpacket" corresponds to SOCK_SEQPACKET When you write a “unix” or “unixpacket” server, use ListenUnix().

 l, err := net.ListenUnix("unix",  &net.UnixAddr{"/tmp/unixdomain", "unix"})
if err != nil {
    panic(err)
}   
defer os.Remove("/tmp/unixdomain")

for {
    conn, err := l.AcceptUnix()
    if err != nil {
        panic(err)
    }
    var buf [1024]byte
    n, err := conn.Read(buf[:])
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s\n", string(buf[:n]));
    conn.Close()
} 

"unixgram" server uses ListenUnixgram().

conn, err := net.ListenUnixgram("unixgram",  &net.UnixAddr{"/tmp/unixdomain", "unixgram"})
if err != nil {
    panic(err)
}   
defer os.Remove("/tmp/unixdomain")

for {
    var buf [1024]byte
    n, err := conn.Read(buf[:])
    if err != nil {
        panic(err)
    }
    fmt.Printf("%s\n", string(buf[:n]));
}

Client is as follows

type := "unix" // or "unixgram" or "unixpacket"
laddr := net.UnixAddr{"/tmp/unixdomaincli", type}
conn, err := net.DialUnix(type, &laddr/*can be nil*/, 
    &net.UnixAddr{"/tmp/unixdomain", type})
if err != nil {
    panic(err)
}   
defer os.Remove("/tmp/unixdomaincli")

_, err = conn.Write([]byte("hello"))
if err != nil {
    panic(err)
}   
conn.Close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment