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();
}
}
}
예제는 동기적 소켓 서버/클라이언트이고 간단하게 하나의 데이터만 주고받고 끝난다.
간단하게 서버/클라이언트 통신 과정만 보기엔 충분한 예제 인 것 같다.
'프로그래밍 > 네트워크 프로그래밍' 카테고리의 다른 글
[네트워크] UDP & TCP 패킷(Packet) 헤더(Header) (0) | 2020.04.18 |
---|---|
[네트워크] UDP, TCP 란? (0) | 2020.04.17 |
[네트워크] OIS 7계층 정리 (0) | 2020.04.16 |