Skip to content

Commit 4e8561c

Browse files
committed
Initial commit
1 parent 43e17a3 commit 4e8561c

File tree

8 files changed

+459
-0
lines changed

8 files changed

+459
-0
lines changed

cmd/basic/client/main.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
}

cmd/basic/server/main.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
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+
}

cmd/readwrite/client/main.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
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+
}

cmd/readwrite/server/main.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
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+
}

cmd/readwrite2/client/main.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
}

cmd/readwrite2/server/main.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
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+
}

0 commit comments

Comments
 (0)