C#

Socket 클라이언트

Socket 클래스

.NET Framework에서 Socket 클래스는 가장 Low 레벨의 클래스로서 TcpClient, TcpListener, UdpClient 들은 모두 Socket 클래스를 이용하여 작성되었다. TcpClient, TcpListener, UdpClient 들이 모두 TCP/IP와 UDP/IP 프로토콜 만을 지원하는 반면, Socket 클래스는 IP 뿐만 아니라 AppleTalk, IPX, Netbios, SNA 등 다양한 네트워크들에 대해 사용될 수도 있다. 여기서는 Socket 클래스를 사용하여 TCP, UDP 네트워크를 사용하는 부분에 대해 살펴 본다.

Socket 클라이언트

Socket 클래스는 클라이언트와 서버에서 공히 사용할 수 있다. 먼저 Socket 클래스를 사용하여 TCP 클라이언트를 만드는 간단한 예제를 살펴보자. 아래 예제는 간단한 메시지를 TCP 서버에 보내고 Echo 된 문자열을 계속 화면에 표시하는 프로그램이다. 이 프로그램은 Q 를 누를 때까지 계속 된다.

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace sockcli
{
    class Program
    {
        static void Main(string[] args)
        {
            // (1) 소켓 객체 생성 (TCP 소켓)
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            // (2) 서버에 연결
            var ep = new IPEndPoint(IPAddress.Parse("192.168.1.13"), 7000);
            sock.Connect(ep);

            string cmd = string.Empty;
            byte[] receiverBuff = new byte[8192];

            Console.WriteLine("Connected... Enter Q to exit");

            // Q 를 누를 때까지 계속 Echo 실행
            while ((cmd = Console.ReadLine()) != "Q")
            {
                byte[] buff = Encoding.UTF8.GetBytes(cmd);

                // (3) 서버에 데이타 전송
                sock.Send(buff, SocketFlags.None);

                // (4) 서버에서 데이타 수신
                int n = sock.Receive(receiverBuff);

                string data = Encoding.UTF8.GetString(receiverBuff, 0, n);
                Console.WriteLine(data);
            }

            // (5) 소켓 닫기
            sock.Close();
        }
    }
}


위 예제를 각 스텝별로 살펴보면,

  1. 먼저 Socket 객체를 생성하는데, 첫번째 파라미터는 IP 를 사용한다는 것이고, 두번째는 스트림 소켓을 사용한다는 것이며, 마지막은 TCP 프로토콜을 사용한다는 것을 지정한 것이다. TCP 프로토콜은 스트림 소켓을 사용하고, UDP는 데이타그램 소켓을 사용한다.
  2. Socket 객체의 Connect() 메서드를 호출하여 서버 종단점(EndPoint)에 연결한다.
  3. 소켓을 통해 데이타를 보내기 위해 Socket 객체의 Send() 메서드를 사용하였다. 데이타 전송은 첫번째 파라미터에 바이트 배열을 넣으면 되고, 두번째 파라미터는 옵션으로 SocketFlags를 지정할 수 있다. 이 플래그는 소켓에 보다 고급 옵션들을 지정하기 위해 사용된다.
  4. 소켓에서 데이타를 수신하기 위해 Socket 객체의 Receive() 메서드를 사용하였다. Receive() 메서드는 첫번째 파라미터에 수신된 데이타를 넣게 되고, Send()와 마찬가지로 SocketFlags 옵션을 지정할 수도 있다. Receive() 메서드는 실제 수신된 바이트수를 정수로 리턴한다.
  5. 마지막으로 소켓을 닫는다.

본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

Previous Next Print