C#

UDP 서버

UDP 서버

UDP 서버는 포트를 열고 클라이언트로부터 들어오는 데이타그램을 수신하게 된다. 즉, UDP 서버는 통상 UDP 포트를 Listening하고 있으면서 루프 안에서 계속 데이타 송수신을 처리하는 형태로 구현된다. TCP 서버는 TCP 클라이언트 연결을 받아들여 Connection을 맺은 후에 데이타 송수신을 진행하는데, UDP는 이러한 Connection 과정이 필요없으며 UDP 클라이언트로부터 데이타그램을 직접 받아 처리하면 된다. 따라서 UDP 서버는 UDP 클라이언트와 같이 거의 동일한 기능을 갖기 때문에 별도의 UDP 서버 클래스가 없고 UdpClient 클래스를 사용한다.

UDP 서버 예제

UDP 서버를 어떻게 구현하는지 예시하기 위해 아래 단순화 예제를 살펴보자. 아래는 UDP 클라이언트로부터 수신한 메시지를 그대로 돌려보내는 간단한 UDP 서버이다.

using System;
using System.Net;
using System.Net.Sockets;

namespace UdpSrv
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) UdpClient 객체 성성. 포트 7777 에서 Listening
            UdpClient srv = new UdpClient(7777);

            // 클라이언트 IP를 담을 변수
            IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);

            while(true)
            {
                // (2) 데이타 수신
                byte[] dgram = srv.Receive(ref remoteEP);
                Console.WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", remoteEP.ToString(), dgram.Length);

                // (3) 데이타 송신
                srv.Send(dgram, dgram.Length, remoteEP);
                Console.WriteLine("[Send] {0} 로 {1} 바이트 송신", remoteEP.ToString(), dgram.Length);
            }
        }
    }
}

위 예제를 각 스텝별로 살펴보면,

  1. UDP 클라이언트로부터 데이타를 받아들이기 위해 먼저 Listening할 포트를 지정하며 UdpClient 객체를 생성한다.
  2. UDP 에서 데이타를 수신하기 위해 UdpClient 객체의 Receive() 메서드를 사용한다. Receive() 메서드는 특히 수신 데이타와 함께 상대 UDP 클라이언트 종단점(IP주소와 포트) 정보도 같이 전달받는데, 이를 위해 IPEndPoint 객체를 ref 파라미터로 전달한다. 데이타 수신 후, ref 파라미터를 체크하면 데이타를 보낸 UDP 클라이언트의 IP 주소와 포트를 알 수 있다.
  3. UdpClient 객체의 Send() 메서드를 사용하여 데이타를 UDP 클라이언트로 전달한다. 이 때 클라이언트 IP는 위의 Receive() 메서드에서 받아온 IP 주소를 사용한다.
  4. 마지막으로 UdpClient 객체를 닫는다.

아래 그림은 위의 UDP 서버와 이전 아티클의 UDP 클라이언트 예제를 실행시킨 화면이다.

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print