File tree Expand file tree Collapse file tree 8 files changed +459
-0
lines changed Expand file tree Collapse file tree 8 files changed +459
-0
lines changed Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "io/ioutil"
6+ "log"
7+ "net"
8+ "time"
9+ )
10+
11+ const (
12+ protocol = "unix"
13+ sockAddr = "/tmp/echo.sock"
14+ )
15+
16+ func main () {
17+ for i := 0 ; i < 5 ; i ++ {
18+ time .Sleep (1 * time .Second )
19+
20+ conn , err := net .Dial (protocol , sockAddr )
21+ if err != nil {
22+ log .Fatal (err )
23+ }
24+
25+ _ , err = conn .Write ([]byte ("hello world" ))
26+ if err != nil {
27+ log .Fatal (err )
28+ }
29+
30+ // サーバ側にクライアントからの書き込みが終わったことを
31+ // 無理やり伝えるためにWrite側のソケットを強制クローズ
32+ // (サンプル以外ではしてはいけない)
33+ err = conn .(* net.UnixConn ).CloseWrite ()
34+ if err != nil {
35+ log .Fatal (err )
36+ }
37+
38+ b , err := ioutil .ReadAll (conn )
39+ if err != nil {
40+ log .Fatal (err )
41+ }
42+
43+ fmt .Println (string (b ))
44+ }
45+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "bytes"
5+ "fmt"
6+ "io"
7+ "log"
8+ "net"
9+ "os"
10+ "os/signal"
11+ "strings"
12+ )
13+
14+ const (
15+ protocol = "unix"
16+ sockAddr = "/tmp/echo.sock"
17+ )
18+
19+ // https://eli.thegreenplace.net/2019/unix-domain-sockets-in-go/
20+ func main () {
21+ cleanup := func () {
22+ if _ , err := os .Stat (sockAddr ); err == nil {
23+ if err := os .RemoveAll (sockAddr ); err != nil {
24+ log .Fatal (err )
25+ }
26+ }
27+ }
28+
29+ cleanup ()
30+
31+ listener , err := net .Listen (protocol , sockAddr )
32+ if err != nil {
33+ log .Fatal (err )
34+ }
35+ defer listener .Close ()
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" )
56+ go echo (conn )
57+ }
58+ }
59+
60+ func echo (conn net.Conn ) {
61+ defer conn .Close ()
62+ log .Printf ("Connected: %s\n " , conn .RemoteAddr ().Network ())
63+
64+ buf := & bytes.Buffer {}
65+ _ , err := io .Copy (buf , conn )
66+ if err != nil {
67+ log .Println (err )
68+ return
69+ }
70+
71+ s := strings .ToUpper (buf .String ())
72+
73+ buf .Reset ()
74+ buf .WriteString (s )
75+
76+ _ , err = io .Copy (conn , buf )
77+ if err != nil {
78+ log .Println (err )
79+ return
80+ }
81+
82+ fmt .Println ("<<< " , s )
83+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "go-unix-domain-socket-example/pkg/message"
6+ "log"
7+ "net"
8+ "time"
9+ )
10+
11+ const (
12+ protocol = "unix"
13+ sockAddr = "/tmp/echo.sock"
14+ )
15+
16+ func main () {
17+ values := []string {
18+ "hello world" ,
19+ "golang" ,
20+ "goroutine" ,
21+ "this program runs on crostini" ,
22+ }
23+
24+ for _ , v := range values {
25+ time .Sleep (1 * time .Second )
26+
27+ conn , err := net .Dial (protocol , sockAddr )
28+ if err != nil {
29+ log .Fatal (err )
30+ }
31+
32+ func () {
33+ defer conn .Close ()
34+
35+ m := & message.Echo {
36+ Length : len (v ),
37+ Data : []byte (v ),
38+ }
39+
40+ err = m .Write (conn )
41+ if err != nil {
42+ log .Fatal (err )
43+ }
44+
45+ err = m .Read (conn )
46+ if err != nil {
47+ log .Fatal (err )
48+ }
49+
50+ fmt .Printf ("%v\n " , m )
51+ }()
52+ }
53+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "go-unix-domain-socket-example/pkg/message"
6+ "log"
7+ "net"
8+ "os"
9+ "os/signal"
10+ "strings"
11+ )
12+
13+ const (
14+ protocol = "unix"
15+ sockAddr = "/tmp/echo.sock"
16+ )
17+
18+ func main () {
19+ if _ , err := os .Stat (sockAddr ); err == nil {
20+ if err := os .RemoveAll (sockAddr ); err != nil {
21+ log .Fatal (err )
22+ }
23+ }
24+
25+ listener , err := net .Listen (protocol , sockAddr )
26+ if err != nil {
27+ log .Fatal (err )
28+ }
29+
30+ quit := make (chan os.Signal )
31+ signal .Notify (quit , os .Interrupt )
32+
33+ go func () {
34+ <- quit
35+ fmt .Println ("ctrl-c pressed!" )
36+ close (quit )
37+ os .Exit (0 )
38+ }()
39+
40+ fmt .Println ("> Server launched" )
41+ for {
42+ fmt .Println ("> wait..." )
43+
44+ conn , err := listener .Accept ()
45+ if err != nil {
46+ log .Fatal (err )
47+ }
48+
49+ fmt .Println (">>> accepted: " , conn .RemoteAddr ().Network ())
50+ go echo (conn )
51+ }
52+ }
53+
54+ func echo (conn net.Conn ) {
55+ defer conn .Close ()
56+
57+ m := & message.Echo {}
58+ err := m .Read (conn )
59+ if err != nil {
60+ log .Println (err )
61+ return
62+ }
63+
64+ s := strings .ToUpper (string (m .Data ))
65+ m .Length = len (s )
66+ m .Data = []byte (s )
67+
68+ err = m .Write (conn )
69+ if err != nil {
70+ log .Println (err )
71+ return
72+ }
73+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "go-unix-domain-socket-example/pkg/message"
6+ "log"
7+ "net"
8+ "time"
9+ )
10+
11+ const (
12+ protocol = "unix"
13+ sockAddr = "/tmp/echo.sock"
14+ )
15+
16+ func main () {
17+ values := []string {
18+ "hello world" ,
19+ "golang" ,
20+ "goroutine" ,
21+ "this program runs on crostini" ,
22+ }
23+
24+ conn , err := net .Dial (protocol , sockAddr )
25+ if err != nil {
26+ log .Fatal (err )
27+ }
28+ defer conn .Close ()
29+
30+ for _ , v := range values {
31+ time .Sleep (1 * time .Second )
32+
33+ m := & message.Echo {
34+ Length : len (v ),
35+ Data : []byte (v ),
36+ }
37+
38+ err = m .Write (conn )
39+ if err != nil {
40+ log .Fatal (err )
41+ }
42+
43+ fmt .Println ("[WRITE] " , m )
44+
45+ err = m .Read (conn )
46+ if err != nil {
47+ log .Fatal (err )
48+ }
49+
50+ fmt .Println ("[READ ] " , m )
51+ }
52+ }
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "fmt"
5+ "go-unix-domain-socket-example/pkg/message"
6+ "io"
7+ "log"
8+ "net"
9+ "os"
10+ "os/signal"
11+ "strings"
12+ )
13+
14+ const (
15+ protocol = "unix"
16+ sockAddr = "/tmp/echo.sock"
17+ )
18+
19+ func main () {
20+ cleanup := func () {
21+ if _ , err := os .Stat (sockAddr ); err == nil {
22+ if err := os .RemoveAll (sockAddr ); err != nil {
23+ log .Fatal (err )
24+ }
25+ }
26+ }
27+
28+ cleanup ()
29+
30+ listener , err := net .Listen (protocol , sockAddr )
31+ if err != nil {
32+ log .Fatal (err )
33+ }
34+
35+ quit := make (chan os.Signal )
36+ signal .Notify (quit , os .Interrupt )
37+
38+ go func () {
39+ <- quit
40+ fmt .Println ("ctrl-c pressed!" )
41+ close (quit )
42+ cleanup ()
43+ os .Exit (0 )
44+ }()
45+
46+ fmt .Println ("> Server launched" )
47+ for {
48+ conn , err := listener .Accept ()
49+ if err != nil {
50+ log .Fatal (err )
51+ }
52+
53+ fmt .Println (">>> accepted: " , conn .RemoteAddr ().Network ())
54+ go echo (conn )
55+ }
56+ }
57+
58+ func echo (conn net.Conn ) {
59+ defer conn .Close ()
60+
61+ for {
62+ m := & message.Echo {}
63+ err := m .Read (conn )
64+ if err != nil {
65+ if err == io .EOF {
66+ fmt .Println ("=== closed by client" )
67+ break
68+ }
69+
70+ log .Println (err )
71+ break
72+ }
73+
74+ fmt .Println ("[READ ] " , m )
75+
76+ s := strings .ToUpper (string (m .Data ))
77+ m .Length = len (s )
78+ m .Data = []byte (s )
79+
80+ err = m .Write (conn )
81+ if err != nil {
82+ log .Println (err )
83+ break
84+ }
85+
86+ fmt .Println ("[WRITE] " , m )
87+ }
88+ }
You can’t perform that action at this time.
0 commit comments