File tree Expand file tree Collapse file tree 2 files changed +149
-0
lines changed Expand file tree Collapse file tree 2 files changed +149
-0
lines changed Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "encoding/gob"
5+ "fmt"
6+ "log"
7+ "net"
8+ "time"
9+
10+ "github.com/devlights/go-unix-domain-socket-example/pkg/message"
11+ )
12+
13+ const (
14+ protocol = "unix"
15+ sockAddr = "/tmp/echo.sock"
16+ )
17+
18+ func main () {
19+ values := []string {
20+ "hello world" ,
21+ "golang" ,
22+ "goroutine" ,
23+ "this program runs on crostini" ,
24+ }
25+
26+ conn , err := net .Dial (protocol , sockAddr )
27+ if err != nil {
28+ log .Fatal (err )
29+ }
30+ defer conn .Close ()
31+
32+ decoder := gob .NewDecoder (conn )
33+ encoder := gob .NewEncoder (conn )
34+
35+ for _ , v := range values {
36+ time .Sleep (1 * time .Second )
37+
38+ m := & message.Echo {
39+ Length : len (v ),
40+ Data : []byte (v ),
41+ }
42+
43+ err = encoder .Encode (m )
44+ if err != nil {
45+ log .Fatal (err )
46+ }
47+
48+ fmt .Println ("[WRITE] " , m )
49+
50+ err = decoder .Decode (m )
51+ if err != nil {
52+ log .Fatal (err )
53+ }
54+
55+ fmt .Println ("[READ ] " , m )
56+ }
57+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "encoding/gob"
5+ "fmt"
6+ "io"
7+ "log"
8+ "net"
9+ "os"
10+ "os/signal"
11+ "strings"
12+
13+ "github.com/devlights/go-unix-domain-socket-example/pkg/message"
14+ )
15+
16+ const (
17+ protocol = "unix"
18+ sockAddr = "/tmp/echo.sock"
19+ )
20+
21+ func main () {
22+ cleanup := func () {
23+ if _ , err := os .Stat (sockAddr ); err == nil {
24+ if err := os .RemoveAll (sockAddr ); err != nil {
25+ log .Fatal (err )
26+ }
27+ }
28+ }
29+
30+ cleanup ()
31+
32+ listener , err := net .Listen (protocol , sockAddr )
33+ if err != nil {
34+ log .Fatal (err )
35+ }
36+
37+ quit := make (chan os.Signal )
38+ signal .Notify (quit , os .Interrupt )
39+
40+ go func () {
41+ <- quit
42+ fmt .Println ("ctrl-c pressed!" )
43+ close (quit )
44+ cleanup ()
45+ os .Exit (0 )
46+ }()
47+
48+ fmt .Println ("> Server launched" )
49+ for {
50+ conn , err := listener .Accept ()
51+ if err != nil {
52+ log .Fatal (err )
53+ }
54+
55+ fmt .Println (">>> accepted: " , conn .RemoteAddr ().Network ())
56+ go echo (conn )
57+ }
58+ }
59+
60+ func echo (conn net.Conn ) {
61+ defer conn .Close ()
62+
63+ decoder := gob .NewDecoder (conn )
64+ encoder := gob .NewEncoder (conn )
65+ for {
66+ m := & message.Echo {}
67+ err := decoder .Decode (m )
68+ if err != nil {
69+ if err == io .EOF {
70+ fmt .Println ("=== closed by client" )
71+ break
72+ }
73+
74+ log .Println (err )
75+ break
76+ }
77+
78+ fmt .Println ("[READ ] " , m )
79+
80+ s := strings .ToUpper (string (m .Data ))
81+ m .Length = len (s )
82+ m .Data = []byte (s )
83+
84+ err = encoder .Encode (m )
85+ if err != nil {
86+ log .Println (err )
87+ break
88+ }
89+
90+ fmt .Println ("[WRITE] " , m )
91+ }
92+ }
You can’t perform that action at this time.
0 commit comments