본문 바로가기

프로그래밍/네트워크 프로그래밍

[네트워크 프로그래밍] C# UDP 소켓 서버/클라이언트 예제로 보는 통신 과정

UDP Flow

UDP는 TCP와 다르게 클라이언트의 Connect() 요청을 기다리는 listen()과 이 연결 요청을 허가하는 accept() 과정이 

없습니다. 이러한 연결 과정이 없기 때문에 UDP는 TCP와는 다르게 비연결형 서비스이며 처리속도가 빠르다.

 

 

C# UDP 소켓 서버/클라이언트 예제

C# UDP 소켓 서버/클라이언트 예제를 통해 UDP 통신 과정을 보자.

 

1. Server

  1) Bind() : IP와 PORT 번호를 바인딩한다. 

  2) RecvFrom() : Client와 소켓 통신을 수행하며 전송되는 데이터를 받는다.

     (예제는 동기적 Server 소켓이므로 Client로부터 데이터를 받지 않으면 다음 SendTo() 과정을 하지 않고 대기한다.) 

  3) SendTo() : Client와 소켓 통신을 수행하며 데이터를 전송한다. 

  4) CloseSocket() : 통신 소켓을 닫는다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace UDP_SERVER
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            // Bind()
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 5555);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            server.Bind(ipep);

            Console.WriteLine("Server Start");

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint remote = (EndPoint)(sender);

            byte[] _data = new byte[1024];

            // ReceiveFrom()
            server.ReceiveFrom(_data, ref remote);
            Console.WriteLine("{0} : \r\nServar Recieve Data : {1}", remote.ToString(), 
                Encoding.Default.GetString(_data));

            // string --> byte[]
            _data = Encoding.Default.GetBytes("Client SendTo Data");

            // SendTo()
            server.SendTo(_data, _data.Length, SocketFlags.None, remote);

            // Close()
            server.Close();

            Console.WriteLine("Press Any key...");
            Console.ReadLine();
        }
    }
}

 

 

2. Client

  1) SendTo() : Server와 소켓 통신을 수행하며 데이터를 전송한다. 

  2) RecvFrom() : Server와 소켓 통신을 수행하며 전송되는 데이터를 받는다.

  3) CloseSocket() : 통신 소켓을 닫는다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;

namespace UDP_CLIENT
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            // string --> byte[]
            byte[] _data = Encoding.Default.GetBytes("Server SendTo Data");

            // Connect() 후 Send() 가능

            // SendTo()
            client.SendTo(_data, _data.Length, SocketFlags.None, ipep);

            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint remote = (EndPoint)(sender);

            _data = new byte[1024];

            // ReceiveFrom()
            client.ReceiveFrom(_data, ref remote);
            Console.WriteLine("{0} : \r\nClient Receive Data : {1}", remote.ToString(), 
                Encoding.Default.GetString(_data));

            // Close()
            client.Close();

            Console.WriteLine("Press Any key...");
            Console.ReadLine();
        }

    }
}

 

예제는 동기적 소켓 서버/클라이언트이고 간단하게 하나의 데이터만 주고받고 끝난다.

간단하게 서버/클라이언트 통신 과정만 보기엔 충분한 예제 인 것 같다.