UDP 서버는 포트를 열고, client로부터 들어오는 데이터그램을 수신하게 된다. UDP 서버는 통상 UDP 포트를 Listening하고 있으면서 루프 안에서 계속 데이터 송수신을 처리하는 형태로 구현된다. TCP 서버는 TCP 클라이언트 연결을 받아들여 Connetion을 맺은 후에 데이터 송수신을 진행하는데, UDP는 이런 Connection 과정이 필요없고, UDP 클라이언트로부터 데이터를 직접 받아서 처리하면 된다.
따라서 UDP 서버는 UDP 클라이언트와 거의 동일한 기능을 갖기 때문에 별도의 UDP 서버 클래스가 없고, UdpClient클래스를 같이 사용하면 된다.
using System;
using System.Net;
using System.Net.Sockets;
namespace UdpSrv
{
class Program
{
static void Main(string[] args)
{
// (1) UdpClient 객체 성성. 포트 7777 에서 Listening
using (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);
Thread.Sleep(500);
// (3) 데이타 송신
srv.Send(dgram, dgram.Length, remoteEP);
Console.WriteLine("[Send] {0} 로 {1} 바이트 송신", remoteEP.ToString(), dgram.Length);
}
}
}
}
}
위 예제를 각 스텝별로 살펴보면,
아래 그림은 위의 UDP 서버와 이전 아티클의 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();
}
}
}