Skip to content

Commit fe7ae97

Browse files
authored
Merge pull request #909 from devlights/add-tcp-io-readfull-example
2 parents 66d1435 + 044b44b commit fe7ae97

File tree

4 files changed

+150
-0
lines changed

4 files changed

+150
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
app
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# io.ReadFull()のサンプル
2+
3+
```sh
4+
$ task
5+
task: [build] go build -o app .
6+
task: [run] ./app -timeout 100ms
7+
03:01:14.980749 [C] recv start
8+
03:01:15.081186 netErr.Timeout()
9+
task: [run] ./app -timeout 3s
10+
03:01:15.091656 [C] recv start
11+
03:01:15.592085 io.ErrUnexpectedEOF
12+
task: [run] ./app -length 10 -timeout 3s
13+
03:01:15.602765 [C] recv start
14+
03:01:15.602902 [C] data=(hhhh)
15+
03:01:15.602912 [C] data=(hhhh)
16+
03:01:16.103520 io.ErrUnexpectedEOF
17+
task: [run] ./app -bufsize 6 -length 12 -timeout 3s
18+
03:01:16.113780 [C] recv start
19+
03:01:16.113887 [C] data=(hhhhhh)
20+
03:01:16.113901 [C] data=(hhhhhh)
21+
03:01:16.614526 io.EOF
22+
```
23+
24+
25+
- [io.ReadFull](https://pkg.go.dev/io@latest#ReadFull)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# https://taskfile.dev
2+
3+
version: '3'
4+
5+
tasks:
6+
default:
7+
cmds:
8+
- task: build
9+
- task: run
10+
build:
11+
cmds:
12+
- go build -o app .
13+
run:
14+
cmds:
15+
- ./app -timeout 100ms
16+
- ./app -timeout 3s
17+
- ./app -length 10 -timeout 3s
18+
- ./app -bufsize 6 -length 12 -timeout 3s
+106
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package main
2+
3+
import (
4+
"errors"
5+
"flag"
6+
"io"
7+
"log"
8+
"net"
9+
"strings"
10+
"time"
11+
)
12+
13+
type (
14+
Args struct {
15+
bufsize int
16+
length int
17+
timeout time.Duration
18+
}
19+
)
20+
21+
var (
22+
args Args
23+
)
24+
25+
func init() {
26+
flag.IntVar(&args.bufsize, "bufsize", 4, "bufsize")
27+
flag.IntVar(&args.length, "length", 2, "length")
28+
flag.DurationVar(&args.timeout, "timeout", 1*time.Second, "timeout")
29+
}
30+
31+
func main() {
32+
log.SetFlags(log.Lmicroseconds)
33+
flag.Parse()
34+
35+
ln, err := net.Listen("tcp", ":8888")
36+
if err != nil {
37+
panic(err)
38+
}
39+
defer ln.Close()
40+
41+
go func() {
42+
conn, err := ln.Accept()
43+
if err != nil {
44+
if errors.Is(err, net.ErrClosed) {
45+
return
46+
}
47+
panic(err)
48+
}
49+
defer conn.Close()
50+
51+
buf := []byte(strings.Repeat("h", args.length))
52+
_, err = conn.Write(buf)
53+
if err != nil {
54+
panic(err)
55+
}
56+
57+
time.Sleep(500 * time.Millisecond)
58+
}()
59+
60+
if err := run(); err != nil {
61+
panic(err)
62+
}
63+
}
64+
65+
func run() error {
66+
conn, err := net.Dial("tcp", ":8888")
67+
if err != nil {
68+
return err
69+
}
70+
defer conn.Close()
71+
72+
log.Println("[C] recv start")
73+
{
74+
buf := make([]byte, args.bufsize)
75+
for {
76+
clear(buf)
77+
78+
err = conn.SetReadDeadline(time.Now().Add(args.timeout))
79+
if err != nil {
80+
return err
81+
}
82+
83+
n, err := io.ReadFull(conn, buf)
84+
if err != nil {
85+
switch {
86+
case errors.Is(err, io.EOF):
87+
log.Println("io.EOF")
88+
return nil
89+
case errors.Is(err, io.ErrUnexpectedEOF):
90+
log.Println("io.ErrUnexpectedEOF")
91+
return nil
92+
default:
93+
var netErr net.Error
94+
if errors.As(err, &netErr) && netErr.Timeout() {
95+
log.Println("netErr.Timeout()")
96+
return nil
97+
}
98+
}
99+
100+
return err
101+
}
102+
103+
log.Printf("[C] data=(%s)", buf[:n])
104+
}
105+
}
106+
}

0 commit comments

Comments
 (0)