Skip to content

Commit 348c092

Browse files
committed
dial 을 통한 연결 수립 만들어보기
1 parent 042de7a commit 348c092

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

README.md

+5
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,8 @@
4343

4444
- 대문자 시작은 외부 접근 가능
4545
- 소문자 시작은 외부 접근 불가
46+
47+
## new() vs make()
48+
49+
- `new()` : 메모리를 할당하고 해당 타입의 기본값을 반환한다. (pointer)
50+
- `make()` : slice, map, channel 을 초기화하고 해당 타입의 참조값을 반환한다. (pointer)

main.go

+7
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,12 @@ func main(){
2929
fmt.Println(err)
3030
}
3131
return
32+
} else {
33+
// 클라이언트 모드
34+
err := monolib.Dial()
35+
if err != nil {
36+
fmt.Println(err)
37+
}
38+
return
3239
}
3340
}

monolib/dial.go

+77
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
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+
}

0 commit comments

Comments
 (0)