Skip to content

Commit 8bfd2b0

Browse files
authored
Merge pull request #906 from devlights/update-use-net-conn-example
2 parents 471af2f + 98cee44 commit 8bfd2b0

File tree

2 files changed

+52
-23
lines changed
  • examples/socket/unix_domain_socket/abstract-namespace/use-net-conn

2 files changed

+52
-23
lines changed

examples/socket/unix_domain_socket/abstract-namespace/use-net-conn/README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,17 @@ task: [build] go build -o app main.go
1616
task: [run] ./app -server &
1717
task: [run] sleep 1
1818
task: [run] ./app
19-
01:59:18.896796 [C] Send (hello)
20-
01:59:18.896882 [S] Recv (hello)
21-
01:59:18.897098 [S] Send (HELLO)
22-
01:59:18.897149 [C] Recv (HELLO)
23-
01:59:18.897174 [C] close
24-
01:59:18.897177 [S] disconnect
25-
01:59:18.897205 [S] close
19+
02:42:06.032066 [C] Send (hello)
20+
02:42:06.032128 [S] Recv (hello)
21+
02:42:06.032345 [S] Send (HELLO)
22+
02:42:06.032365 [C] Recv (HELLO)
23+
02:42:06.032378 [C] SEND FIN (shutdown(SHUT_WR))
24+
02:42:06.032382 [S] disconnect
25+
02:42:06.032410 [S] close
26+
02:42:06.032413 [C] disconnect
27+
02:42:06.032436 [C] close
2628
task: [run] pkill -INT -f './app -server'
27-
01:59:18.909751 [S] Shutdown...
29+
02:42:06.043557 [S] Shutdown...
2830
```
2931

3032
## 参考情報

examples/socket/unix_domain_socket/abstract-namespace/use-net-conn/main.go

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"net"
1414
"os"
1515
"os/signal"
16+
"time"
1617
)
1718

1819
type (
@@ -117,26 +118,29 @@ func runServer() error {
117118
}
118119
log.Printf("[S] Send (%s)", message)
119120

120-
// Graceful shutdown
121-
{
122-
unixConn, ok := conn.(*net.UnixConn)
123-
if !ok {
124-
errCh <- fmt.Errorf("conn.(*net.UnixConn) failed")
125-
return
126-
}
121+
// FIN待機用のタイムアウト設定
122+
err = conn.SetReadDeadline(time.Now().Add(2 * time.Second))
123+
if err != nil {
124+
log.Printf("[S] SetReadDeadline error: %v", err)
125+
errCh <- err
126+
return
127+
}
127128

128-
err = unixConn.CloseWrite()
129-
if err != nil {
130-
errCh <- err
131-
return
129+
for {
130+
clear(buf)
131+
if n, err = conn.Read(buf); n == 0 || errors.Is(err, io.EOF) {
132+
log.Println("[S] disconnect")
133+
break
132134
}
133135

134-
for {
135-
clear(buf)
136-
if n, err = conn.Read(buf); n == 0 || errors.Is(err, io.EOF) {
137-
log.Println("[S] disconnect")
136+
if err != nil {
137+
if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
138+
log.Println("[S] timeout (client FIN)")
138139
break
139140
}
141+
142+
errCh <- err
143+
return
140144
}
141145
}
142146
}()
@@ -180,5 +184,28 @@ func runClient() error {
180184
message := string(buf[:n])
181185
log.Printf("[C] Recv (%s)", message)
182186

187+
// Graceful shutdown
188+
{
189+
unixConn, ok := conn.(*net.UnixConn)
190+
if !ok {
191+
return fmt.Errorf("conn.(*net.UnixConn) failed")
192+
193+
}
194+
195+
err = unixConn.CloseWrite()
196+
if err != nil {
197+
return err
198+
}
199+
log.Println("[C] SEND FIN (shutdown(SHUT_WR))")
200+
201+
for {
202+
clear(buf)
203+
if n, err = conn.Read(buf); n == 0 || errors.Is(err, io.EOF) {
204+
log.Println("[C] disconnect")
205+
break
206+
}
207+
}
208+
}
209+
183210
return nil
184211
}

0 commit comments

Comments
 (0)