UDP 어플리케이션은 코드상으로 서버와 클라이언트 구분이 없다. 하지만 구현상 그 기능으로 서버와 클라이언트를 구별한다. 코드를 살펴보면 서버와 클라이언트는 별 반 차이가 없다.

주의
서버와 클라이언트 모두 동일한 UDP 포트 번호를 바인드하기 때문에 서로 다른 시스템에서 실행시켜야 된다.

서버 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace UDP
{
    class Server
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            /* 로컬 IPEndPoint, 서버 주소와 포트가 된다.
             * 서버 주소를 192.168.0.10으로 고정하기 위해서는
             * IPAddress.Parse("192.168.0.10", port)를 사용해야 한다.
             * 여기서는 서버 주소가 고정이 아니기 때문에 IPAddress.Any를 사용한다.
             */
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            /* 서버에서 broadcast로 데이터를 전송하기 위해서는 소켓 옵션을 설정해야 한다. */
            server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
           
            /* 로컬 시스템의 0513포트에 바인드한다.
             * UDP 서버 프로그램에 들어오는 UDP패킷을 수신하기 위해서는 로컬 시스템의 특정 포트에 바인드되어야 한다.
             * 로컬 시스템에는 한번에 하나의 프로그램만이 특정 포트 번호에 바인드할 수 있다. 따라서 이미 사용중인 포트 번호로 바인드할 수 없다.
             */
            server.Bind(ipepLocal);


            /* 목적지 IPEndPoint, 서버와 통신하는 클라이언트의 주소와 포트가 된다.
             * 데이터를 전송할 클라이언트 IP를 192.168.0.11으로 고정하기 위해서는 IPAddress.Parse("192.168.0.11", port)를 사용한다.
             * broadcast로 날릴경우 IPAddress.Broadcast로 설정한다.
             */
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.11"), port);
            EndPoint remote = (EndPoint)ipepDest;

            // 에코 루틴
            while (true)
            {
                buff = new byte [1024];
                recv = server.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);

                if (recvStr == "exit") break;

                server.SendTo(buff, recv, SocketFlags.None, ipepDest);
                Console.WriteLine("{0}\t{1} 전송", ipepDest.ToString(), recvStr);
            }

            server.Close();
        }
    }
}



클라이언트 코드
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace UDPClient
{
    class Client
    {
        static void Main(string[] args)
        {
            const int port = 0513;
            byte[] buff = null;
            int recv;

            Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            // 로컬 IP, port
            IPEndPoint ipepLocal = new IPEndPoint(IPAddress.Any, port);
            EndPoint remote = (EndPoint)ipepLocal;
            client.Bind(ipepLocal);

            // 접속할 서버 IP
            IPEndPoint ipepDest = new IPEndPoint(IPAddress.Parse("192.168.0.10"), port);

            while (true)
            {
                string inputStr = Console.ReadLine();
                client.SendTo(Encoding.ASCII.GetBytes(inputStr), ipepDest);
                if (inputStr == "exit") break;

                buff = new byte[1024];
                recv = client.ReceiveFrom(buff, ref remote);
                string recvStr = Encoding.ASCII.GetString(buff, 0, recv);
                Console.WriteLine("{0}\t{1}", remote.ToString(), recvStr);
            }

            Console.WriteLine("Stopping client");
            client.Close();
        }
    }
}


+ Recent posts