이번 글에서는 golang 내장 모듈을 이용하여 udp connection을 만들어서 client가 "ping"이라고 보내면 server는 바로 "ping"을 return 해주는 예제를 만들어보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package main
import (
"fmt"
"log"
"net"
"time"
)
func MakeUDPServer() net.Addr {
server, err := net.ListenPacket("udp", "127.0.0.1:")
if err != nil {
log.Fatal(err)
}
fmt.Println("server address: ", server.LocalAddr().String())
go func() {
for {
buf := make([]byte, 1024)
n, clientAddress, err := server.ReadFrom(buf)
if n == 0 {
fmt.Println("buffer size is 0...")
}
if n > 0 {
fmt.Println("server received: ", buf[:n], "from", clientAddress)
}
if err != nil {
log.Fatal(err)
}
_, err = server.WriteTo(buf[:n], clientAddress)
if err != nil {
log.Fatal(err)
}
}
}()
return server.LocalAddr()
}
func main() {
serverAddr := MakeUDPServer()
client, err := net.ListenPacket("udp", "127.0.0.1:")
if err != nil {
log.Fatal(err)
}
fmt.Println("client address: ", client.LocalAddr())
time.Sleep(3*time.Second)
client.WriteTo([]byte("ping"), serverAddr)
buf := make([]byte, 1024)
n, addr, _ := client.ReadFrom(buf)
fmt.Println("client received: ", buf[:n], addr)
}
|
cs |
Network Programming With Go 책에서는 서버에서 udp 생성시 tcp를 쓸 때 사용하는 net.Listen보다는
net.ListenPacket을 권장하고 있습니다.
해당 함수를 사용하여 server를 만들고 해당 주소를 확인해보기 위해 출력을 해봅니다.
그리고 고루틴을 이용하여 비동기로 처리하는데 udp 서버로 데이터가 들어오면 ReadFrom함수를 이용하여 데이터를 받을 수 있습니다.
ReadFrom함수가 어떤 데이터가 올 때까지 block이 되는지 안되는지를 확인해보기 위해 "ping"을 보내기전 3초간의 텀을 두고 n이 0일 때도 출력을 해보았는데 실행시 해당 조건문은 출력이 안되는걸로 보아 ReadFrom함수는 데이터가 오기전까지 block 되는 듯 합니다.
main function에서 client용 udp 서버를 만들고 "ping"을 보내면 서버도 그대로 "ping"을 반환할 것이고 client.ReadFrom을 통해 확인 해볼 수 있습니다. 아래는 결과 예시입니다.
byte값이 동일한 것을 보아 "ping"을 제대로 주고 받은 것을 알 수 있습니다.
그러나 client 입장에서는 net.ListenPacket대신 net.Listen("udp", addr)를 통해 connection을 만들어놓으면 Write, Read시에 좀 더 깔끔한 코드를 작성할 수 있습니다.
'golang' 카테고리의 다른 글
./ 경로 사용시 주의점 (0) | 2021.04.25 |
---|---|
golang network bytes함수를 이용한 marshal/unmarshal (0) | 2021.04.18 |
Golang network#2 tcp buffer (0) | 2021.04.12 |
golang cancel과 waitGroup 기초 (0) | 2021.04.11 |
golang signal과 context 기초 (0) | 2021.04.06 |