-
Notifications
You must be signed in to change notification settings - Fork 10
/
main.go
92 lines (75 loc) · 1.34 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package main
import (
"encoding/gob"
"fmt"
"io"
"log"
"net"
"os"
"os/signal"
"strings"
"github.com/devlights/go-unix-domain-socket-example/pkg/message"
)
const (
protocol = "unix"
sockAddr = "/tmp/echo.sock"
)
func main() {
cleanup := func() {
if _, err := os.Stat(sockAddr); err == nil {
if err := os.RemoveAll(sockAddr); err != nil {
log.Fatal(err)
}
}
}
cleanup()
listener, err := net.Listen(protocol, sockAddr)
if err != nil {
log.Fatal(err)
}
quit := make(chan os.Signal)
signal.Notify(quit, os.Interrupt)
go func() {
<-quit
fmt.Println("ctrl-c pressed!")
close(quit)
cleanup()
os.Exit(0)
}()
fmt.Println("> Server launched")
for {
conn, err := listener.Accept()
if err != nil {
log.Fatal(err)
}
fmt.Println(">>> accepted: ", conn.RemoteAddr().Network())
go echo(conn)
}
}
func echo(conn net.Conn) {
defer conn.Close()
decoder := gob.NewDecoder(conn)
encoder := gob.NewEncoder(conn)
for {
m := &message.Echo{}
err := decoder.Decode(m)
if err != nil {
if err == io.EOF {
fmt.Println("=== closed by client")
break
}
log.Println(err)
break
}
fmt.Println("[READ ] ", m)
s := strings.ToUpper(string(m.Data))
m.Length = len(s)
m.Data = []byte(s)
err = encoder.Encode(m)
if err != nil {
log.Println(err)
break
}
fmt.Println("[WRITE] ", m)
}
}