[C# 강좌 27강]소켓 통신 - 1

공부/C#  2012.10.05 09:00



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

요즘 감기에 걸려서 제가 컨디션이 말이 아니네요.ㅜㅜ 모두들 감기 조심하시구요.

이번 포스팅에서는 소켓 통신에 대해서 살펴 보겠습니다.

우리가 네트워크 프로그래밍을 하다 보면 소켓, 소켓 이런 말을 많이 들어 보셨을 거라 생각 됩니다. 소켓이란 네트워크 상의 가장 끝에 있는 플러그라고 생각하시면 됩니다.

조금 더 쉽게 설명하면 우리가 전기를 이용하는 데 중간에 전기선, 변압기 등으로 구성 되어있는데 소켓은 마지막에 있는 멀티탭이라고 생각하면 됩니다.

우리는 전기를 이용하는데 코드를 멀티탭에 꼽기만 하면 전기를 이용할 수 있지요.

우리가 지금 보는 인터넷 브라우져도 결국에는 iis의 소켓으로 시작하여 인터넷을 통해 패킷을 전송하고 마지막 브라우져에 있는 소켓을 통해 우리가 정보를 볼 수 있는 것이라고 생각하면 됩니다.

 

소켓은 우리가 사용하는 네트워크의 표준의 하나로써 소켓의 정의에 대한 설명만 해도 몇장의 포스팅을 할 정도로 방대합니다. (사실 저도 그렇게 소켓의 정의는 네트워크 표준이라는 것까지 알지 자세한 이론적 내용을 알지 못합니다. ^^)

 

그럼 설명은 여기까지 하고 소켓의 주요 네임스페이스에 대해 알아보겠습니다.

MSDN : System.Net MSDN 바로가기

 

 

System.Net 에는 기본 소켓 통신 뿐 아니라 FTP,HTTP,SMTP 등의 여러 통신 방식을 클래스로 묶고 있어서 꼼꼼히 읽어보고 필요 하신 부분이 있으면 사용하시면 됩니다.

 

System.Net 네임스페이스까지 봤고 본격적인 서버프로그램, 클라이언트 프로그램 예제로 소켓 예제를 살펴 보겠습니다.

MSDN - System.Net.Socket MSDN 바로가기

 

 

연결지향 소켓 프로그램(TCP)은 클라이언트가 대기 중인 서버(LISTEN)에 접속(CONNECT)를 함으로써 접속 확인(ACCEPT)을 한 후 통신이 이루어 지는 형태 입니다.

 

 

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

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Net;
  5 using System.Net.Sockets;
  6
  7 namespace Blog_Server20121004
  8 {
  9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14         }
15         public Program() {
16             IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9999);
17             Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
18
19             server.Bind(ipep);
20             server.Listen(20);
21
22             Console.WriteLine("Server Start... Listen port 9999...");
23
24             Socket client = server.Accept();
25             IPEndPoint ip = (IPEndPoint)client.RemoteEndPoint;
26             Console.WriteLine("주소 {0} 에서 접속",ip.Address);
27
28             String _buf = "명월 서버에 오신 걸 환영합니다.";
29             Byte[] _data = Encoding.Default.GetBytes(_buf);
30             client.Send(_data);
31             _data = new Byte[1024];
32             client.Receive(_data);
33             _buf = Encoding.Default.GetString(_data);
34             Console.WriteLine(_buf);
35
36             client.Close();
37             server.Close();
38         }
39     }
40 }
41

 

 

클라이언트 입니다.

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Net;
  5 using System.Net.Sockets;
  6
  7 namespace Blog_Client_20121004
  8 {
  9     class Program
10     {
11         static void Main(string[] args)
12         {
13             new Program();
14         }
15         public Program() {
16             IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
17             Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
18             client.Connect(ipep);
19             Console.WriteLine("Socket connect");
20             Byte[] _data = new Byte[1024];
21             client.Receive(_data);
22             String _buf = Encoding.Default.GetString(_data);
23             Console.WriteLine(_buf);
24             _buf = "소켓 접속 확인 됐습니다.";
25             _data = Encoding.Default.GetBytes(_buf);
26             client.Send(_data);
27             client.Close();
28
29             Console.WriteLine("Press any key...");
30             Console.ReadLine();
31         }
32     }
33 }
34

 

 

결과 화면 입니다.

 

 

여기까지가 소켓통신 TCP 입니다. 이번 포스팅만으로 TCP 소켓통신을 모두 이해 했으라고는 생각되지 않습니다. 네트워크 프로그래밍은 작게는 메신져부터 크게는 온라인 게임까지 다방면으로 사용되는 부분입니다. 그만큼 복잡하고 설계가 중요한 부분이기도 하지요. 아직은 제 포스팅이 적어 많은 예제가 없지만 (앞으로 많이 작성할 예정) 네이버 검색등을 하면 많은 네트워크 예제들이 많이 있습니다. 많은 연습을 통해 네트워크 기법을 익히시기 바랍니다.

 

다음 포스팅에서는 UDP에 대한 설명에 대해 포스팅을 하겠습니다 감사합니다.




댓글 1개가 달렸습니다.
댓글쓰기
  1. Tltiqchqh
    2014.01.06 16:41 신고 |  수정/삭제  댓글쓰기

    감사합니다.
    근데 봐도 봐도 모르겠네요...
    죄송한데 이거 보기전에 어디 과목을 봐야 되는지 알수 있을까요?;