[C# 강좌 - 33] 소켓 통신 - 2


Study/C#  2012. 10. 7. 10:55

안녕하세요. 개발자 명월입니다.


이번 포스팅에서는 UDP 통신에 대해 알아보겠습니다.

이전 포스팅에서 알아본 TCP와 UDP의 차이는 TCP는 연결지향형으로써 서버가 LISTEN(대기) 상태에서 클라이언트가 (CONNECT)를 확인하고 연결이되면 소켓으로 정보를 주고 받고 마지막으론 커넥션이 끝나는 것까지 확인 할 수 있습니다. 즉 연결이 확인이 되는 형태이기에 패킷의 신뢰성이 높은 편이나 서버가 한대이고 클라이언트가 여러대인 경우는 하나하나 커넥션을 확인해야 하기 때문에 리소스를 많이 잡아 먹습니다.

그와 달리 UDP는 LISTEN이나 CONNECTION이 일어나지 않고 단순히 정보를 주고 받고 하므로써 신뢰성은 상당히 떨어지는 형태를 띄나(정보가 잘 전송되는지 않되는지 확인이 안됨) 커넥션을 유지하지 않기 때문에 리소스 확보를 많이 할 수 있는 장점이 있습니다.


역시 설명보다는 하나의 그림을 확인 후에 예제로 확인해 보겠습니다.

 

그림에서 확인 하듯이 LISETN 과 CONNECTION 이 없습니다.

그럼 예제로 확인 해 보겠습니다.

 

먼저 서버 프로그램 부터 만들어 보겠습니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace Blog20121007
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program();
        }
        public Program()
        {
            IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
            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];
            server.ReceiveFrom(_data,ref remote);
            Console.WriteLine("{0} : Recieve: {1}",remote.ToString(),Encoding.Default.GetString(_data));

            _data = Encoding.Default.GetBytes("명월서버");
            server.SendTo(_data,_data.Length,SocketFlags.None,remote);

            server.Close();

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

 

클라이언트입니다.

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;

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

            byte[] _data = Encoding.Default.GetBytes("Connection!");
            client.SendTo(_data, _data.Length, SocketFlags.None, ipep);

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

            _data = new byte[1024];
            client.ReceiveFrom(_data, ref remote);
            Console.WriteLine("{0} : Receive: {1}",remote.ToString(),Encoding.Default.GetString(_data));

            client.Close();

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

결과 화면입니다.

 

 

여기까지 UDP가 완료 되었습니다. TCP와 UDP를 알아보았습니다. TCP와 UDP의 차이는 실생활에서 네이트온과 인터넷 IIS의 차이라고 생각하시면 됩니다. 즉 네이트온은 지속적으로 인터넷에 연결되어서 실시간으로 정보를 주고 받지만 IIS(www)은 우리가 지정한 웹 브라이져를 요청하면 데이터를 읽어드리는 값으로 커넥션은 종료하게 됩니다.

이 차이를 잘 알고 개발 하실때 불특정 다수와 통신을 하는지 또는 정확히 지정된 사용자와 통신을 하는지 구분을 해야 하겠습니다.

 

다음 포스팅에서는 핼퍼 클래스와 Socket 통신을 연속적으로 하면 패킷이 밀리는 현상이 발생하는 데 이 현상을 해결하는 방법에 대해 알아보도록 하겠습니다.