Go言語でのunix domain socket

Goでunix domain socketの通信を行いたい

ネットで色々と探しましたが、
なかなか情報が見つかりにくかったので、
個人的なメモを書いておきます

サンプル

2秒毎にクライアントからサーバにhiってメッセージを送るだけのものです

server

package main

import (
    "log"
    "net"
    "os"
    "path/filepath"
)

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() {
    file := filepath.Join(os.TempDir(), "unixdomaisocketsample")
    os.Remove(file)

    l, err := net.Listen("unix", file)
    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"
    "os"
    "path/filepath"
    "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() {
    file := filepath.Join(os.TempDir(), "unixdomaisocketsample")
    c, err := net.Dial("unix", file)
    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(time.Second * 2)
    }
}

unix domain socketの解説

qiita.com

参考にしたサイト

stackoverflow.com

qiita.com

qiita.com