ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 소켓 프로그래밍 (네트워크) #1
    C# 예제 공부일기 2020. 7. 29. 19:29

    소켓이란 벽에 연결되어있는 콘센트 전원부라고 생각하는 것이 일반적이다. 네트워크 개념에서도 비슷한 개념이다. 네트워크 프로그래밍에서의 소켓은 네트워크 환경에 연결할 수 있게 만들어진 연결부가 바로 네트워크 소켓이다.

     

    그렇다면 콘센트는 막 만들어도 되는것인가? 답은 전혀 아니다. 일반적으로 벽에 있는 콘센트도 110V 혹은 220V의 규약에 의해 만들어진다. 소켓 또한 프로토콜에 의해서 만들어지는데 주로 OSI 7계층에서 4계층 Transport Layer의 TCP프로토콜로 만들어진다. 여기서 우리가 만드는 프로그램은 응용계층이고 TCP프로토콜을 이용하기위해 만든 소켓을 TCP소켓 혹은 TCP/IP 소켓이라고 한다.

     

    우리(Client)가 네트워크를 통해 서버(Server)에 접속한다고 한다면 두가지 정보가 필요하다. 바로 IP주소와 포트번호가 필요하다 IP주소는 집주소, 포트번호는 동,호수를 얘기한다고 생각하면 편하다. 평소에 네이버나 다음주소를 들어갈 때는 IP주소나 포트번호를 입력해서 들어가지 않는데, DNS 서버가 이 도메인 주소를 IP주소로 바꿔주고, 네이버나 다음같은 웹서버는 기본적을 HTTP 포트인 80번이 자동으로 입력되게 되어있다.

     

    포트번호란 동 호수를 얘기한다고 했는데, 이 동 호수 안에는 프로그램이 들어있다. 해당 포트로 들어왔을 때 그 집 안에 있는 프로그램에 해당하는 동작을 한다. 예를 들어 SSH의 포트번호는 22번인데 외부에서 IP주소와 22번 포트번호로 접속을 하면 SSH에 해당하는 원격접속 동작을 하는 것이다.

     

    여기서 한가지 개념이 더 필요한데 컴퓨터에는 LAN카드라는 것이 내장되어있고, LAN카드마다 MAC주소라고 하는 고유한 주소가 존재한다. IP주소로 그 컴퓨터를 찾아가려고 하는데, 어떻게 찾는지는 이 MAC주소라고 하는 것을 통해서 찾아간다. IP주소를 MAC주소로 바꾸고 IP주소를 MAC주소로 바꾸는 프로토콜을 ARP와 RARP라고 한다. 

     

    그럼 이제 C#에서 제공하는 System.Net 클래스를 사용해서 프로그래밍을 한다.

    static void Main(string[] args)
            {
                //1
                IPAddress ipAddr = IPAddress.Parse("202.179.177.21");
                Console.WriteLine(ipAddr);
                //2
                IPAddress ipAddr2 = new IPAddress(new byte[] { 202, 179, 177, 21 });
                Console.WriteLine(ipAddr2);
                //3
                IPHostEntry entry = Dns.GetHostEntry("www.naver.com");
                foreach (var item in entry.AddressList)
                {
                    Console.WriteLine(item);
                }
                //4
                string myComputer = Dns.GetHostName();
    
                Console.WriteLine("컴퓨터 이름 : " + myComputer);
                //5
                IPHostEntry entry2 = Dns.GetHostEntry(myComputer);
                foreach(IPAddress ipAddress in entry2.AddressList)
                {
                    Console.WriteLine(ipAddress.AddressFamily + ": " + ipAddress);
                }
            }

    1번주석에서는 IPAddress라는 클래스를 생성하는데

     

    IPAddress의 구성은 위와 같다. 여기서 문자열 "202.179.177.21" 를 IPAddress형식으로 변환해서 ipAddr객체에 할당한다. 그러면 IP주소를 가지게 된다. 따라서 ipAddr를 출력하게되면 Ip주소 형식인 202.179.177.21이 출력된다.

     

    2번 주석에서도 마찬가지로 IP주소를 할당하는데 

    생성자로 해당부분이 호출되어 IP주소가 저장된다. 출력결과는 위와 마찬가지이다.

     

    3번 주석에서는 인터넷 호스트 주소 정보에 대한 컨테이너 클래스를 제공하는 IPHostEntry에서 간단한 도메인 이름 확인 기능을 찾아주는 Dns기능을 사용해서 www.naver.com에  에 대한 IP주소를 찾아와서 entry의 AddressList에 저장하고 출력한다.

     

    4번 주석에서는 나 자신의 컴퓨터에 대한 호스트이름이 문자열에 저장된다. 호스트 이름을 바탕으로 주소모음(IPv4,IPv6 등등)가져와 entry2에 저장한뒤 리스트를 반복문을 통해 출력한다.

Designed by Tistory.