본문 바로가기

Golang/etc

golang udp example

728x90
반응형

chapter 6에서 upd 서버와 클라이언트 프로그램에 대해 공부했으니, 코드를 예시로 작성해봤다. 

 

먼저 server.go

 

package main

import (
	"fmt"
	"log"
	"net"
)

func handleUDPConnection(conn *net.UDPConn) {
	buffer := make([]byte, 1024)

	// udp connection으로 부터 값을 읽어들인다. 
	n, addr, err := conn.ReadFromUDP(buffer)
	if err != nil {
		log.Fatal(err)
	}
    
    // 리턴 값은 전달 받은 클라이언트 서버의 address, msg
	fmt.Println("UDP client : ", addr)
	fmt.Println("Received from UDP client : ", string(buffer[:n]))

	// 클라이언트로 msg write
	msg := []byte("Hello UDP Client")
	_, err = conn.WriteToUDP(msg, addr)
	if err != nil {
		log.Fatal(err)
	}
}

func main() {
	// 첫 번째 파라미터에는 udp 값을, 두 번째 파라미터에는 ip와 port 번호를 전달
    // 반환 값으로 udp의 endpoint를 전달한다.
	udpAddr, err := net.ResolveUDPAddr("udp4", "localhost:6000")
	if err != nil {
		log.Fatal(err)
	}
	
    // udp endpoint를 파라미터로 넘기면 udp connection을 리턴한다.
	listen, err := net.ListenUDP("udp", udpAddr)
	if err != nil {
		log.Fatal(err)
	}

	// listen하고 있는 상태
	fmt.Println("UDP server up and listening on port 6000")
	defer listen.Close()

	for {
		handleUDPConnection(listen)
	}
}

 

UDP 소켓은 연결과 해제의 과정이 없음으로 위와 같은 코드를 작성한다. 

서버에서는 연결이 들어오면 클라이언트 서버에서 보낸 메시지를 읽고, 그 서버로 다시 응답 메시지를 전송하고 있다. 

 

client.go

package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	
    // client 프로그램이기 때문에, server쪽의 udp endpoint를 remoteAddr 변수로 생성
	remoteAddr, err := net.ResolveUDPAddr("udp", "localhost:6000")
	if err != nil {
		log.Fatal(err)
	}

	// 생성한 remoteAddr로 dial, 이때 local address 자동 할당 되기 때문에 nil 값으로 넘겨도 무방하다. 
	conn, err := net.DialUDP("udp", nil, remoteAddr)
	if err != nil {
		log.Fatal(err)
	}

	// 각각 주소 확인
	log.Println("Remote UDP addr : ", conn.RemoteAddr().String())
	log.Println("Local UDP client address : ", conn.LocalAddr().String())

	defer conn.Close()

	
    // udp connection을 통해 server 프로그램으로 메시지 write
	msg := []byte("Hello UDP Server!")
	_, err = conn.Write(msg)
	if err != nil {
		log.Fatal(err)
	}


	// server에서 전송한 msg read 후 프로그램 종료
	buf := make([]byte, 1024)
	n, addr, err := conn.ReadFromUDP(buf)

	fmt.Println("UDP Server : ", addr)
	fmt.Println("Received from UDP server : ", string(buf[:n]))
}

서버는 for 문 안에서 connection을 유지하고 있지만,

클라이언트 프로그램에서는 메시지를 전송하고 다시 답장을 받으면 종료되게끔 만들어져 있다.

 

 

실행 결과는 아래와 같다. 

클라이언트 프로그램의 ip, port를 지정해주지 않았음에도 자동 할당 된 것을 확인할 수 있다. 

728x90
반응형

'Golang > etc' 카테고리의 다른 글

tcp/ip -08 DNS  (0) 2022.07.06
tcp/ip - 07 소켓의 종료  (0) 2022.07.04
tcp/ip 05  (0) 2022.07.03
tcp/ip 04  (0) 2022.06.28
tcp/ip -02,03  (0) 2022.06.27