본문 바로가기
golang

golang network udp connection 기초

by PudgeKim 2021. 4. 17.

이번 글에서는 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