C#

UDP 클라이언트

UDP 프로토콜

UDP(User Datagram Protocol)는 TCP와 같이 IP에 기반한 Transport Layer 프로토콜이다. UDP는 단 2가지 기능 만을 수행하는데, IP 위에 포트를 더하는 일과 데이타 Corruption을 감지해 불량 데이타를 폐기하는 일이다. TCP는 송수신 전에 반드시 연결(Connection)이 전제되어야 하는 반면, UDP는 별도의 연결이 필요없다. 비유하자면, TCP는 전화와 같이 통신 전에 미리 연결이 되어야 하고, UDP는 메일과 같이 주소만 알면 그냥 보낼 수 있다. UDP의 단점으로는 데이타가 중간에 유실될 수도 있고 데이타가 도달하는 순서도 뒤바뀔 수도 있다는 점이 있는데, UDP는 TCP와 달리 연결이 필요없고 통신 절차가 단순하기 때문에 더 효율적일 수 있으며, 데이타의 신뢰성이 그렇게 중요하지 않는 경우에는 유용하게 사용될 수도 있다. 예를 들어, 비디오 스트리밍이나 Skype, 연속적인 날씨 데이타, 주식 시세 등과 같이 뒤에 계속 데이타가 들어 오기 때문에 중간에 데이타 하나가 유실되더라도 크게 문제가 없는 경우 UDP가 많이 사용된다. UDP는 또한 Broadcast와 Multicast에 유용하게 사용된다.

UDP를 사용하기 위해서는 System.Net.Sockets 네임스페이스 안의 UdpClient 클래스나 Socket 클래스를 사용한다. TCP와 달리 UDP는 별도의 UDP 서버 클래스가 없으며, 서버도 UdpClient 클래스를 사용한다.

UdpClient 사용법

UdpClient 클래스를 어떻게 사용하는지 살펴보기 위해 아주 단순화된 예제를 살펴보자. 아래 예제는 간단한 메시지를 UDP 서버에 보내고 응답을 읽어 화면에 표시하는 간단한 프로그램이다.

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using static System.Console;

namespace UdpCli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) UdpClient 객체 성성
            UdpClient cli = new UdpClient();

            string msg = "안녕하세요";
            byte[] datagram = Encoding.UTF8.GetBytes(msg);
            
            // (2) 데이타 송신
            cli.Send(datagram, datagram.Length, "127.0.0.1", 7777);
            WriteLine("[Send] 127.0.0.1:7777 로 {0} 바이트 전송", datagram.Length);

            // (3) 데이타 수신
            IPEndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
            byte[] bytes = cli.Receive(ref epRemote);
            WriteLine("[Receive] {0} 로부터 {1} 바이트 수신", epRemote.ToString(), bytes.Length);

            // (4) UdpClient 객체 닫기
            cli.Close();
        }
    }
}

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

  1. UDP 통신을 위해 System.Net.Sockets 네임스페이스의 UdpClient 객체를 생성한다. UdpClient 생성자에서 서버와 포트를 줄 수도 있지만, 만약 하나의 UdpClient 객체로 여러 서버에 데이타를 보낼 경우는 Send() 메서드에서 서버와 포트를 지정한다.
  2. UdpClient 객체의 Send() 메서드를 사용하여 데이타(UDP에서 datagram 이라 함)를 서버로 보낸다. 네트워크 데이타 송수신은 기본적으로 바이트 데이타를 사용하는데, 따라서 문자열을 보낼 경우 먼저 바이트로 인코딩한 후 보내게 된다. 보통 일반 영문은 ASCII로 인코딩하고, 한글 등 비영문 문자열은 UTF 인코딩을 사용한다.
    UDP 데이타그램은 최대 65,507 바이트까지 전송할 수 있다.
  3. UDP에서 데이타를 수신할 경우는 UdpClient 객체의 Receive() 메서드를 사용한다. Receive() 메서드는 특히 수신 데이타와 함께 상대 컴퓨터의 종단점(IP주소와 포트) 정보도 같이 전달받는데, 이를 위해 IPEndPoint 객체를 ref 파라미터로 전달한다. 이를 통해 데이타가 수신되면 누가 그 데이타를 전송했는지 알 수 있다. TCP와 달리 UDP는 Connectionless 프로토콜이기 때문에 이렇게 누가 보낸 데이타인지를 알 필요가 있다.
  4. 마지막으로 UdpClient 객체를 닫는다.

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

Previous Next Print