login register Sysop! about ME  
qrcode
    최초 작성일 :    2004년 03월 24일
  최종 수정일 :    2004년 03월 24일
  작성자 :    pluginnz (최윤규)
  편집자 :    Taeyo (김 태영)
  읽음수 :    29,044

강좌 목록으로 돌아가기

필자의 잡담~

플러그인(pluginn@naver.com) 님의 .NET 소켓 프로그래밍 강좌, 그 두번째 시간입니다.

소켓

저번 강좌에서 "소켓과 TCP/IP" 에 대해 알아보았는데 사실 소켓을 연결점 또는 종단점(EndPoint) 이라고만 얘기했는데 그것이 어떤건지는? 자세히 설명 하지 않았다. 자 소켓이 무엇일까? 서로 떨어진 컴퓨터를 연결하게 해 줄 수있는 인터페이스라고 했는데 구체적으로 어떠한 모양을 가지는지 한번 생각해보자.

멀리 떨어진 컴퓨터라면 서로 통신하기위해 32bit 의 IP 를 이용할 것이다. 그럼 이것이 소켓인가?단지 IP 가지고만 통신 할 수 있을까? 뭔가 부족하다 눈치 빠른 사람이라면 벌써 느끼고 있을것이다. 바로 "Port(포트)" 다. 실제로 서비스들은 IP:Port 로 구성되어 서비스 되어진다. 이는 하나의 IP에서 여러개의 서비스를 구성 할 수 있다는 의미도 된다.이미 우리가 알고 있듯이 웹은 80, FTP 20,21 텔넷은 23번 등등.. 즉 연결을 맺기위한 각 컴퓨터의 소켓은 IP:Port 로 이루어진다. 즉 우리는 FTP 나 HTTP 와 같이 하나의 서비스를 만드는것이다 서버도 만들고 ASP에서 사용될 클라이언트용도 만들어야 하는것이다.(IANA(Internet Assigned Numbers Authority) 에서 포트에 대한 표준안을 정하고 관리한다. )

System.Net & System.Net.Sockets

상당히 직관적인 이름을 가지고 있는 System.Net 과 System.Net.Sockets 네임스페이스는 소켓을 비롯해 IP 검색 및 데이터 전송/수신을 위한 클래스 등의 네트웍과 관련된 각종 클래스들로 이루어져 있다.

일단 우리가 앞서 프로그래밍 하는데 필요한 몇 가지 중요 클래스들을 알아보도록 하겠다.

System.Net.IPAddress   : 특정 IP 를 IPAddress 객체로 생성한다. IPAddress 는 소켓의 연결점을 만드는데 반드시 필요하며,보통 IPAddress..Parse() 메소드 로 생성한다.

System.Net.Dns : 어떠한 도메인에 대한 도메인 정보를 가져오는 데 사용된다.특히 http://www.taeyo.pe.kr 과 같이 ip 가 아닌 도메인의 정보로 IPAddress 를 획득하는데 자주이용된다. Dns.Resolve() 메소드를 이용하여 IPAddress 의 배열 클래스인 System.Net.IPHostEntry형식으로 리턴되며, 이는 여러대의 웹서버를 이용하는 웹팜과 같은 경우에 해당 도메인에 등록된서버들의 IP 를 모두 얻어올 수 있다. 물론 그 외에 도메인 과 관련된 정보도 얻어 올 수 있다.

System.Net.IPHostEntry: IPAddress. 의 배열 클래스가 IPHostEntry 이며, 위에서 방금 얘기한Dns.Resolve() 메소드를 이용할 경우 IPHostEntry 인스턴스를 리턴한다.

System.Net.IPEndPoint  : 소켓을 설명하면서 얘기한 바로 종단점(연결점)을 만드는 클래스 이다.소켓은 IP 와 무엇으로 구성되었다고 했는가? 그렇다 포트이다. 이 클래스의 생성자는IP 와 Port 를 인자로 받아 IPEndPoint 로 객체를 생성한다. (여기서 IP 는 IPAddress 일수도 있고String 형식도 가능하며, Port는int 형식으로 입력 받도록 다양하게 오버로딩 되어있다.)- System.Net.Sockets.Socket - 소켓 클래스의 생성자는 객체 생성시 소켓에 대한 다양한 설정을 할 수 있다. IPv4 인지 IPv6 인지 , TCP 형식인제 UDP 형식인지 등의 정보를 열거형으로 입력하고 설정한 환경에 해당되는 인스턴스를 생성한다. 그리고 소켓의 Bind() 메소드를 통해 소켓의 종단점인 IPEndPoint 를 메소드에 넘김으로써 소켓의 준비는 끝나게 된다.

위에 설명한 클래스들을 하나씩 테스트 해보도록 하자

.Net 을 실행하고 간단하게 테스트 하기위해 Console Application 을 선택하고 Project 명은 임의대로입력하기 바란다.

자 우리가 위의 소켓과 관련된 클래스를 사용하기 위해서는 위에서 말했듯이System.Net 과 System.Net.Socket 네임스페이스 안에 네트웍과 관련된 클래스 들이 모두 포함되어져 있다. using 명령어로 선언 하여, 프로그램시 네임스페이스를 모두 써야하는 불편함을 없애자.

www.msn.co.kr(207.46.68.21) 사이트의 IP 를 입력하여 IPAddress 객체를 얻어내는 코딩을 해보자

* 소켓의 연결점 을 만들기 위해 IPAddress 객체를 얻어내는 방법 (위에서 언급했듯이 소켓은 IP 와 Port 로 이루어져 있다. IP는 IPAddress의 객체이며 Port 는 int 형이라고도 업급했다. 우리는 서버에 접근하기위해 캡슐화된 IPAdress 객체가 필요하다)

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

namespace StartSocket
{

    class Class1
    {

        [STAThread] static void Main(string[] args)
        {
            IPAddress ipaddr =IPAddress.Parse("207.46.68.21");
            Console.WriteLine(ipaddr.ToString());
        }
    }
}

[설명]

System.Net.IPAddress 클래스의 Parse() 메소드를 이용하여 IPAddress 의 객체인 ipaddr 생성을 시도하고 있다. 이는 문자열을 인수로 받으며 IPAddress 를 리턴한다., 아래 Parse() 메소드의 시그너쳐를 보면 리턴형이 IPAddress 인것을 볼 수 있다.


System.Net.IPAddress.Parse() 메소드의 시그너쳐

위의 경우는 "207.46.68.21" 처럼 IP 알고 있을경우는 문제 없이 IPAddress 객체를 만들 수 있다 .하지만 대부분의 사람들이 IP는 기억하지 않는다. 그래서 System.Net.Dns 클래스 의 Resolve() 메소드를 이용해서 얻어내는 방법을 코딩해보자

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

namespace StartSocket
{
    class Class1
    {
        [STAThread] static void Main(string[] args)
        {
            IPHostEntry ipentry= Dns.Resolve("www.microsoft.com");

            foreach(IPAddress ipaddr in ipentry.AddressList)
            {
                Console.WriteLine(ipaddr.ToString());
            }
        }
    }
}

www.microsoft.com 사이트의 IP 주소를 얻기위해 Dns.Resolve() 메소드를 사용하였다.Dns.Resolve() 메소드도 IPAddress.Parse(string ip) 메소드 처럼 정적 메소드로 객체 생성없이 사용하였다. Dns의 Resolve() 메소드에 마우스를 갖다가 대보자.

[설명]

리턴형이 IPHostEntry 인것을 볼 수 있다.

    IPHostEntry ipentry= Dns.Resolve("www.microsoft.com");

자!! ipendtry 객체에는 www.microsoft.com 도메인에 등록된 서버들의 IP 들이 IPAddress 의 배열형태인IPHostEntry 클래스로 만들어져 있다. 배열이기 때문에 foreach 문을 통해서 모두 출력해 보았다

        foreach(IPAddress ipaddr in ipentry.AddressList)
        {
            Console.WriteLine(ipaddr.ToString());
        }

(참고로 배열 인덱스로 접근하여 하나의 IPAddress 를 가져올수도있다. 하지만 도메인이 가지는IP 갯수는 도메인 마다 다르므로 System.IndexOutOfRangeException 이 발생하지 않도록 하자)ipentry 객체는 이제 www.microsoft.com 도메인에 대해 몇 가지 속성을 가지고 있는데, IP 를얻어오기 위해서는 ipentry 의 AddressList 속성으로 접근하여 IPAddress 클래스 타입의 객체를하나씩 얻어올수가 있다. foreach 문을 돌려 객체를 생성해 내고 Console.WriteLine 문으로 IP를 출력해 보았다


www.microsoft.com 도메인에는 총 8개의 IP 를 사용하고 있다

위 그림은 IPEntryHost 객체의 AddressList 를 통해 IP 를 출력해보았는데, 다른 속성도 이용해 보도록하자. 그럼 혹시 www.microsoft.com 도메인 왜에 또다른 도메인으로 매핑되어 있지 않나 한번 확인해보자. 이때는 IPEntryHost객체.Aliases 속성으로 접근 한다. 아래와 같이 수정해 보자

[수정전]
foreach(IPAddress ipaddr in ipentry.AddressList) : AddressList 부분을 아래와 같이 수정해보자

[수정후]
foreach(string ipaddr in ipentry.Aliases)

자~ www.microsoft.com 이라는 사이트가 또 다른 도메인인 www.microsoft.akadns.net 이라는 URL을 가지고 있다는 것을 알 수 있다.

여러분들이 한번 www.taeyo.pe.kr 사이트 IPAddress 를 System.Net.Dns.Resolve() 를 이용하여 생성해보자

[팁]

가끔 프로그래밍을 하다보면 URL 분석을 할 경우가 필요하다. 이럴때 정말 유용한 클래스 하나를 소개하겠다. 바로 System.Uri 클래스 이다. 자. 백문이불여일타 이다. 아래와 같이 코딩해보자

using System;
namespace StartSocket
{
    class Class1
    {
        [STAThread] static void Main(string[] args)
        {
            string taeyoUrl="http://www.taeyo.pe.kr/threadboard/Content.asp?table=Board_Asp&seqs=93626&page=1";

            Uri uri = new Uri(taeyoUrl);

            Console.WriteLine("Host : " + uri.Host);
            // www.taeyo.pe.kr
            Console.WriteLine("URL Query : " + uri.Query);
            //?table=Board_Asp&seqs=93626&page=1&IsSearch= 쿼리가 출력된다.
            Console.WriteLine("Host Type:" + uri.HostNameType);
            // Dns 가 출력된다. IP 인경우 IPv4 로 출력된다.
            Console.WriteLine(uri.AbsolutePath);
            //threadboard/Content.asp 절대 경로가 출력된다.
        }
    }

Url 에 대한 정보를 상세하게 분석하여 필요한 정보를 대부분 string 형태로 얻어올 수 있다정말 유용한 클래스 이다.

이번 강좌는 IP 를 이용해서 IPAddress 를 얻는 방법에 대해 알아보았다.아직까지는 다소 준비과정에 불과한거 같다. 다음 강좌에서는 IPAddress 를 이용해 IPEndPoint객체를 만들고 TCP/UDP 소켓을 만드는 방법에 대해 알아보겠다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})