C# 외부, 내부 IP를 알아내기

*머리글
어떤 사항에 맞는 IP을 알아내는 방법
1. HostName으로 내컴퓨터의 IP을 알 수 있습니다.
2. 특정사이트의 IP을 가져올 수 있습니다. (도메인의 IP임)
3. IP을 알려주는 사이트를 통하여 자신의 외부IP을 알 수 있습니다(꼼수)


1. 자산의 HOSTNAME을 통하여 자신의IP을 알 수 있습니다.

// using을 추가합니다.
using System.Net;



// 자신의 HOSTNAME으로 IP가져오기
// 지정된 DNS 호스트 이름에서 DNS 정보를 가져옵니다.
IPHostEntry IPHost = Dns.GetHostByName(Dns.GetHostName());
textBox2.Text = IPHost.AddressList[0].ToString();






2. 특정사이트의 IP을 알아내기 (Get IP Address from DNS Hostname in c#)
즉, DNS Hostname을 통해서 IP을 가져오는 방법입니다.

// using을 추가합니다.
using System.Net;

//특정사이트 도메인주소
string sitedomain = "www.daum.net";

//지정된 호스트의 IP(인터넷 프로토콜) 주소를 반환합니다.
IPAddress[] addresslist = Dns.GetHostAddresses(sitedomain);

//GetHostAddresses 메서드를 사용하여 IP 주소를 IPAddress 형식의 배열로 확인합니다.
foreach (IPAddress theaddress in addresslist)
{
    textBox1.Text = theaddress.ToString();
}




3. 꼼수로 외부 아이피 가져오기

공유기를 사용하면 자신의 외부 아이피를 가져와서 보여주게 만들기 힘들었다.
내부아이피를 가져오는 경우가 있는 것이다.

외국 포럼의 경우 외부 아이피(External Ip)를 어떻게 가져오는 지 이야기 하고 있다.

Showing the external IP-address in C#
http://www.dreamincode.net/forums/showtopic24692.htm

결론은 꼼수를 이용하는 것이다. 웹페이지중 자신의 외부 아이피를 보여주는 웹사이트들이 있다.
이 정보를 가져와서 이용하는 것이다.


자신의 외부아이피를 보여주는 사이트들입니다.
http://www.whatismyip.com/automation/n09230945.asp
http://whatismyip.com
http://checkip.dyndns.org/




// using을 추가합니다.
using System.Net;


// 꼼수 (외부아이피 알려주는 사이트로 문자열 가져오기)
try
{
    string whatIsMyIp = "http://www.whatismyip.com/automation/n09230945.asp";
    WebClient wc = new WebClient();
    UTF8Encoding utf8 = new UTF8Encoding();
    string requestHtml = "";

    requestHtml = utf8.GetString(wc.DownloadData(whatIsMyIp));

    IPAddress externalIp = null;

    externalIp = IPAddress.Parse(requestHtml);

    textBox3.Text = externalIp.ToString();

}
catch
{
    throw;
}




또는 더욱 간단히 요약하여 아래와 코드로 정리하죠 ^^

// using을 추가합니다.
using System.Net;


// 꼼수 (외부아이피 알려주는 사이트로 문자열 가져오기)
string WanIP = new System.Net.WebClient().DownloadString(("http://www.whatismyip.com/automation/n09230945.asp"));
textBox3.Text = WanIP.ToString();



          



데모프로그램 (Demo Projcet)




작성된 코드 정리하여 소스 첨부합니다. (Source Project Download)


( 실행시 에러가 난다면 아마도 그건 닷넷프레임웍이 설치 되어 있지 않아서 에러가 나는 게 100%(빽프로)입니다. )
 - C#은 닷넷 프레임웍(Microsoft .NET Framework)이 설치되어 있어야 동작한답니다.

닷넷 프레임웍(Microsoft .NET Framework) 3.5 다운로드
http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=333325fd-ae52-4e35-b531-508d977d32a6

이 글은 "씨디맨" 의 동의 없이 전문 재배포 금지. 링크 및 트랙백은 허가 없이 무제한 허용 *  [자세히보기]

질문 또는 댓글을 남겨 주세요.

질문글은 무조건 답변 드리겠습니다. 이곳에 질문을 올려주세요.
이 글과 연관이 없는 급한 질문은 빠른 질문/답변을 이용해 주세요!

댓글 입력 폼

:)   :(   --;   :D   :O   :x   r:r   g;g   i;t   s;s

     이미지 업로드  [무료이미지 업로드 방법 설명]

  1. 머니야 머니야 2009.05.11 10:39 신고

    C# 프로그램 잠시 만져본적 있어요^^
    그이전 c, cpp가 몸에 젖다보니..c#트래킹..안할수가 없더군요~
    팁이 필요하신 분들에게 좋은정보 제공해 주시는것 같아여~
    즐거운 한주되세요^^

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.05.13 13:01 신고

      네 즐거운 하루되세요.
      꼼수 포함해서 좋은 팁이 되었으면 합니다. ㅋ

      perm. |  mod/del. | 
  2. 솔이아빠 2009.05.11 12:29 신고

    잘보고 갑니다. ^^;

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.05.13 13:03 신고

      네~
      잘은 몰라도 외부아이피 확인
      사이트 정도는 유용할듯 합니다.

      perm. |  mod/del. | 
  3. 구차니 2009.05.11 14:37 신고

    C# 물러가라~ 물러가라~ /ㅁ/
    전 C만 좋아합니다 ㅠ.ㅠ

    perm. |  mod/del. |  reply.
  4. 민시오™ 2009.05.11 16:55 신고

    아.. 어렵당.. ㅎㅎ 하지만 알아두면 유용하게 쓰일것 같아요~

    perm. |  mod/del. |  reply.
  5. 마음의꿀단지 2009.05.11 22:00 신고

    궁금하던 차에 cdmanii님이 올려 주시는 군요 ㅎㅎ ㅋㅋ ^^
    테스팅 해봐야 겠습니다 !!

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.05.15 23:45 신고

      ㅜ_ㅜ cdmanii 동생인 엔돌슨이에요 ~~
      제가 글쓴거구요. C#은 많이 한게 아니라서 여기저기 참고하여 공부중이구요~

      perm. |  mod/del. | 
  6. fd 2009.05.12 07:37 신고

    dd

    perm. |  mod/del. |  reply.
  7. 돌이아빠 2009.05.12 19:01 신고

    C#은 영 >.< 다뤄본적이 없네요. 글고보니 프로그래밍을 한지가 에고에고....

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.05.15 23:49 신고

      저는 응용프로그래밍을 좋아하는 데
      최근 회사에서 asp.net with c#으로 개발중이라서
      C#에 관심이있었는 데 더 애착이 가서요.
      winform 이 더 좋은데 가끔 이렇게 습작한답니다

      역시 프로그램은 매 한가지기때문에
      웹환경하고 CS환경빼고는 크게 차이가 나지 않네요
      WPF, 실버라이트 등 알건 많지만
      실무에서는 다 쓰는건 아니니깐용 ~

      perm. |  mod/del. | 
  8. 마니또피부관리실 2009.05.14 17:59 신고

    좋은 정보 감사합니다
    요즘 나름 바빠서 방문이 좀뜸합니다
    이해해 주시와요 ^^

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.05.21 08:33 신고

      네~ 새벽님 ㅋ~
      괜찮습니다. 요즘 포스팅이 늦어서 좋은걸로 찾아뵙겠습니다.

      perm. |  mod/del. | 
  9. 건강정보 2009.05.15 11:18 신고

    이럼 꼼수도 있군요..^^

    한동안 매일 놀러와도 안 보이셔서 어디가셨나? 했는데
    이제 컴백하신거죠?~^^

    perm. |  mod/del. |  reply.
  10. june 2009.05.22 14:40 신고

    고마워요!

    perm. |  mod/del. |  reply.
  11. 완전.! 2009.07.29 15:46 신고

    유용한 정보 였답니다... ^_^ 감사하빈다.

    perm. |  mod/del. |  reply.
  12. Tomoya 2009.08.10 17:29 신고

    안녕하세요. 정보 얻은 김에 하나 개선점 발견해서 적습니다.

    노트북 같은 경우나 여러 랜카드를 쓰는 서버 컴퓨터의 경우
    랜카드(유.무선) 같이 쓸 때 IP 2개 이상 받아오는 경우가 있는데 그 부분에 대해서
    한 IP만 받아 오게 되어있던데..아래와 같이 교체 하는건 어떨까 싶습니다.

    맥 어드레스나 게이트웨이등은 http://sevenwind.pe.kr/130026943542를 참고했습니다.

    string extra = Get_Extra_MyIP1();

    if (extra.Equals("")) extra = Get_Extra_MyIP2();

    NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();

    datas = new string[adapters.Length];

    for (int i = 0; i < adapters.Length; i++)
    {
    if (adapters[i].NetworkInterfaceType.ToString().Equals("Ethernet"))
    {
    string text_info = "";

    //string myip = Get_MyIP(i);

    UnicastIPAddressInformationCollection uic = adapters[i].GetIPProperties().UnicastAddresses;

    string myip = "";
    try
    {
    if (uic.Count == 1)
    {
    myip = uic[0].Address.ToString();
    }
    }
    catch
    {

    }

    add_IPlist(myip);

    IPInterfaceProperties adapterProperties = adapters[i].GetIPProperties(); //IP 인터페이스
    GatewayIPAddressInformationCollection Gatewayaddresses = adapterProperties.GatewayAddresses; //게이트웨이 주소
    IPAddressCollection dhcpServers = adapterProperties.DhcpServerAddresses; //DHCP 서버주소
    IPAddressCollection dnsServers = adapterProperties.DnsAddresses; // DNS 서버주소

    text_info += "네트워크 카드: " + adapters[i].Description + Environment.NewLine; //네트워크정보
    text_info += " Physical Address ..... : " + adapters[i].GetPhysicalAddress() + Environment.NewLine; //MAC(Media Access Control)주소반환
    if(myip !="") text_info += " IP Address ..... : " + myip + Environment.NewLine; //자기 자신의 IP 정보 출력하는 매서드를 만든후 호출
    if (!extra.Equals("") && !extra.Equals(myip) && Gatewayaddresses.Count > 0)
    {
    text_info += " 외부 IP주소 : " + extra + "\r\n";
    add_IPlist(extra);
    }

    ....


    public static string Get_Extra_MyIP1()
    {
    string extra = "";
    try
    {
    string whatIsMyIp = "http://www.whatismyip.com/automation/n09230945.asp";
    WebClient wc = new WebClient();
    UTF8Encoding utf8 = new UTF8Encoding();
    string requestHtml = "";

    requestHtml = utf8.GetString(wc.DownloadData(whatIsMyIp));

    IPAddress externalIp = null;

    externalIp = IPAddress.Parse(requestHtml);

    extra = externalIp.ToString();

    }
    catch
    {
    extra = "";
    }

    return extra;
    }

    public static string Get_Extra_MyIP2()
    {
    string extra = "";
    try
    {
    string whatIsMyIp = "http://ipconfig.co.kr";
    WebClient wc = new WebClient();
    UTF8Encoding utf8 = new UTF8Encoding();
    string requestHtml = "";

    requestHtml = utf8.GetString(wc.DownloadData(whatIsMyIp));

    requestHtml = requestHtml.Substring(requestHtml.IndexOf("ipconfig.co.kr&ip="));

    requestHtml = requestHtml.Replace("ipconfig.co.kr&ip=", "");

    requestHtml = requestHtml.Remove(requestHtml.IndexOf("'>")).Trim();

    IPAddress externalIp = null;

    externalIp = IPAddress.Parse(requestHtml);

    extra = externalIp.ToString();

    }
    catch(Exception)
    {
    extra = "";
    }

    return extra;
    }

    perm. |  mod/del. |  reply.
    • 엔돌슨 2009.08.11 08:39 신고

      오오오~ 블로그 두군데 다 들어가보았습니다.
      참고하겠습니다. 세심한 베려감사합니다~
      좀 부족하여 공부할때 참고 하겠습니다.

      perm. |  mod/del. | 
    • nkghost0303 2010.04.12 20:27 신고

      http://www.whatismyip.com/automation/n09230945.asp에 의존적이라는 생각이드네요..

      perm. |  mod/del. | 
  13. TerNer 2011.07.26 16:57 신고

    음 .. 만악 텍스트 박스에 IP를 입력하고 버튼을 누르면 IP/TCP 연결이 가능한지 여부를 확인하는 방법은 없을까요 ?

    perm. |  mod/del. |  reply.