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();
}
}
}
'닷넷 프레임워크' 카테고리의 다른 글
Hex 문자열을 실제 Hex값으로 변경 (0) | 2009.12.30 |
---|---|
memset in c# (0) | 2009.12.20 |
[C#] 실행시간 측정 (0) | 2009.10.20 |
MDB에서 쿼리문에 이상이 없는데도 구문 오류가 발생할 경우 (0) | 2009.09.24 |
텍스트 박스 유효성 체크 (0) | 2009.09.22 |