File tree 3 files changed +89
-0
lines changed
3 files changed +89
-0
lines changed Original file line number Diff line number Diff line change 43
43
44
44
- 대문자 시작은 외부 접근 가능
45
45
- 소문자 시작은 외부 접근 불가
46
+
47
+ ## new() vs make()
48
+
49
+ - ` new() ` : 메모리를 할당하고 해당 타입의 기본값을 반환한다. (pointer)
50
+ - ` make() ` : slice, map, channel 을 초기화하고 해당 타입의 참조값을 반환한다. (pointer)
Original file line number Diff line number Diff line change @@ -29,5 +29,12 @@ func main(){
29
29
fmt .Println (err )
30
30
}
31
31
return
32
+ } else {
33
+ // 클라이언트 모드
34
+ err := monolib .Dial ()
35
+ if err != nil {
36
+ fmt .Println (err )
37
+ }
38
+ return
32
39
}
33
40
}
Original file line number Diff line number Diff line change
1
+ package monolib
2
+
3
+ import (
4
+ "fmt"
5
+ "net"
6
+ "io"
7
+ )
8
+
9
+ func Dial () error {
10
+ // 랜덤 포트에 리스너 생성
11
+ listener , err := net .Listen ("tcp" , "127.0.0.1:0" )
12
+ if err != nil {
13
+ fmt .Println (err )
14
+ return err
15
+ }
16
+ defer listener .Close ()
17
+
18
+ // make 는 채널을 생성합니다.
19
+ // chan 은 채널 타입을 나타냅니다.
20
+
21
+ // done 채널을 생성합니다.
22
+ // 빈 구조체는 메모리를 사용하지 않습니다.
23
+ done := make (chan struct {})
24
+
25
+ // 리스너의 고루틴을 루프에서 처리하고 각 연결 처리 로직을 담당하는 것을 핸들러라고 합니다.
26
+ go func () {
27
+
28
+ // done
29
+ defer func () {
30
+ fmt .Println ("done" )
31
+ done <- struct {}{}
32
+ }()
33
+
34
+ for {
35
+ // 리스너에서 연결을 받습니다.
36
+ conn , err := listener .Accept ()
37
+ if err != nil {
38
+ fmt .Println (err )
39
+ return
40
+ }
41
+
42
+ go func (c net.Conn ) {
43
+ defer func () {
44
+ fmt .Println ("conn done" )
45
+ c .Close ()
46
+ done <- struct {}{}
47
+ }()
48
+
49
+ buf := make ([]byte , 1024 )
50
+ for {
51
+ // 연결에서 데이터를 읽습니다.
52
+ n , err := c .Read (buf )
53
+ if err != nil {
54
+ if err != io .EOF {
55
+ fmt .Println (err )
56
+ }
57
+ return
58
+ }
59
+ fmt .Println ("received" ,string (buf [:n ]))
60
+ }
61
+ }(conn )
62
+ }
63
+
64
+ }()
65
+
66
+ conn , err := net .Dial ("tcp" , listener .Addr ().String ())
67
+ if err != nil {
68
+ fmt .Println ("dial error" , err )
69
+ return err
70
+ }
71
+
72
+ conn .Close ()
73
+ <- done
74
+ listener .Close ()
75
+ <- done
76
+ return nil
77
+ }
You can’t perform that action at this time.
0 commit comments