go: easy socket server

Unix domain socket, česky unixový soket, je v informatice prostředkem meziprocesové komunikace, jenž je charakterizován restrikcí na jednu instanci operačního systému (méně přesně na jeden počítač) a možností zajistit komunikaci v obou směrech. Tyto dvě vlastnosti, instrument unixového soketu odlišující od jiných typů interprocesní komunikace, vycházejí z jeho návrhu, který počítá se dvěma komunikačními kanály (jedním pro každý směr), ne však se síťovými identifikátory (jimiž jsou zpravidla IP adresy).

Nástroj lze použít ke komunikaci dvou procesů, nebo ke komunikaci dvou vláken jednoho procesu. Zajištění funkčnosti spadá do režie jádra operačního systému, přičemž rozhraní je zpřístupněno prostřednictvím systémových volání. Způsob obsluhy rozhraní komunikujícími stranami je podobný jako v případě síťových soketů. Jak z názvu prostředku vyplývá, unixový soket je příznačný pro unixové operační systémy.

main.go

package main

import (
	"fmt"
	"io"
	"log"
	"net"
	"os"
)

const socketFile = "./app.socket"

func echoServer(c net.Conn) {
	log.Printf("Client connected [%s]", c.RemoteAddr().Network())
	_, err := io.Copy(c, c)
	if err != nil {
		log.Fatal(err)
	}
	c.Close()
}

func main() {
	fmt.Println("socket:", socketFile)

	if err := os.RemoveAll(socketFile); err != nil {
		log.Fatal(err)
	}

	l, err := net.Listen("unix", socketFile)
	if err != nil {
		log.Fatal("listen error:", err)
	}
	defer l.Close()

	for {
		conn, err := l.Accept()
		if err != nil {
			log.Fatal("accept error:", err)
		}

		go echoServer(conn)
	}

}

Spuštění serveru

go run main.go

Připojení klienta

nc -U ./app.socket
Publikováno v Go