자신 IP 얻어내기 (WinXP 버전)

purewell의 이미지

ㅡ.,-) 뭐... kldp가 Linux을 위한 것이지만,
리눅스/Windows 사이를 왔다갔다 하는 프로그래머를 위해
정리해둡니다. 으헤헤헤~*

//------------------------------------------------------------------------------
//
// Get machine ip addresses by sockaddr for sockaddr_in/sockaddr_in6.
//
// AUTHOR  : Yubin Lim
// DATE    : 2004-11-05
// EMAIL   : purewell at purewell dot biz
// REQUIRE : MICROSOFT PLATFORM SDK(IPHLPAPI.LIB),
//           WINDOWS XP,
//           Visual C/C++ Compiler
//
//------------------------------------------------------------------------------


#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iptypes.h>
#include <iphlpapi.h>

#pragma comment(lib, "iphlpapi")
#pragma comment(lib, "ws2_32")

static bool win32_getMyIP(int nFamily)
{
  DWORD dwRet;
  PIP_ADAPTER_ADDRESSES pAdpAddrs;
  PIP_ADAPTER_ADDRESSES pThis;
  PIP_ADAPTER_UNICAST_ADDRESS pThisAddrs;
  unsigned long ulBufLen = sizeof(IP_ADAPTER_ADDRESSES);

  pAdpAddrs = (PIP_ADAPTER_ADDRESSES)malloc( ulBufLen );
  if ( !pAdpAddrs ) return false;

  dwRet = GetAdaptersAddresses(nFamily, 0, NULL, pAdpAddrs, &ulBufLen);
  if (dwRet == ERROR_BUFFER_OVERFLOW)
  {
    free ( pAdpAddrs );
    pAdpAddrs = (PIP_ADAPTER_ADDRESSES)malloc( ulBufLen );

    if ( !pAdpAddrs ) return false;
  }

  dwRet = GetAdaptersAddresses(nFamily, 0, NULL, pAdpAddrs, &ulBufLen);
  if ( dwRet != NO_ERROR )
  {
    free ( pAdpAddrs );
    return false;
  }

  for ( pThis = pAdpAddrs; NULL != pThis; pThis = pThis->Next)
  {
    fprintf(stderr," FN: %S\n", pThis->FriendlyName);
    fprintf(stderr," DS: %S\n", pThis->Description);
    fprintf(stderr," AN: %S\n", pThis->AdapterName);
    for ( pThisAddrs = pThis->FirstUnicastAddress;
          NULL != pThisAddrs;
          pThisAddrs = pThisAddrs->Next )
    {
      if ( nFamily == AF_INET )
      {
        struct sockaddr_in* pAddr
          = (struct sockaddr_in*)pThisAddrs->Address.lpSockaddr;

        cerr << "  IP v4: " << inet_ntoa(pAddr->sin_addr) << endl;
      }
      else if ( nFamily == AF_INET6 )
      {
        struct sockaddr_in6* pAddr
          = (sockaddr_in6*)pThisAddrs->Address.lpSockaddr;

        //! @todo convert binary address type to string type
        cerr << "  IP v6" << endl;
      }
    }//for
  }//for

  free ( pAdpAddrs );

  return true;
}


int main(void)
{
  win32_getMyIP(AF_INET);
  win32_getMyIP(AF_INET6);
  return 0;
}
Forums: 
익명 사용자의 이미지

00

elfs의 이미지

codebank의 이미지

elfs wrote:
http://ifconfig.co.kr/

조크... :twisted:


run cmd
ipconfig

조크2... :twisted:

------------------------------
좋은 하루 되세요.

버려진의 이미지

codebank wrote:
elfs wrote:
http://ifconfig.co.kr/

조크... :twisted:


run cmd
ipconfig

조크2... :twisted:

http://ip.pe.kr
조크3... :twisted:

opt의 이미지

촙5 wrote:
codebank wrote:
elfs wrote:
http://ifconfig.co.kr/

조크... :twisted:


run cmd
ipconfig

조크2... :twisted:

http://ip.pe.kr
조크3... :twisted:

http://checkip.dyndns.org
죄송합니다.
왠지 이 조크를 계속 이어나가야만 할 것 같은 강한 사명감이 들어서... :wink:
조크4

----
LUX ET VERITAS | Just for Fun!

qprk의 이미지

opt wrote:
촙5 wrote:
codebank wrote:
elfs wrote:
http://ifconfig.co.kr/

조크... :twisted:


run cmd
ipconfig

조크2... :twisted:

http://ip.pe.kr
조크3... :twisted:

http://checkip.dyndns.org
죄송합니다.
왠지 이 조크를 계속 이어나가야만 할 것 같은 강한 사명감이 들어서... :wink:
조크4

http://www.qprk.pe.kr/cgi-bin/ip/ip.cgi
조크5 -,.-;

멋진남자...

sangwoo의 이미지

opt wrote:
촙5 wrote:
codebank wrote:
elfs wrote:
http://ifconfig.co.kr/

조크... :twisted:


run cmd
ipconfig

조크2... :twisted:

http://ip.pe.kr
조크3... :twisted:

http://checkip.dyndns.org
죄송합니다.
왠지 이 조크를 계속 이어나가야만 할 것 같은 강한 사명감이 들어서... :wink:
조크4

음..
http://whatismyip.com/
조크5 (죄송합니다 =3 =3)

----
Let's shut up and code.

익명 사용자의 이미지

netsh dump | findstr "set\ address"

익명 사용자의 이미지

route print | findstr 127.0.0.1

love8june의 이미지

whatismyip.com
간다하죠.
이미 프로그램이 만들어져 있는 website에요.

rest in peace

clublaw의 이미지

항상 이런식의 글에 제가 달아두는 글입니다.

mailto XXX 지금 회사 사무실에가서 내 PC의 IP를 확인하고 나에게 문자로 알려주게

"빈손으로 사랑하려는 자에게 세상은 너무 가혹하다."

comdemo의 이미지

내부 ip 쓰는 경우에는 외부로 나가는 ip와 내부에서 사용중인 ip가 다르므로 이를 구별해서 알아내야 하지 않을까요?? ^^

beta의 이미지

http://www.ipchicken.com/

조크 동참. - -;

발 담갔다. 이제 익숙해 지는길만이..

musiphil의 이미지

http://groups.google.co.kr/groups?selm=3DBCDC98.AF453CB1%40bawi.org

Quote:

Win32에서는 local IP address를 구하는 전혀 다른 방법이 존재합니다.
WSAIoctl을 이용하여 SIO_GET_INTERFACE_LIST 요청을 하는 방법입니다.
이 방법을 사용하면 각 인터페이스별로 상태와 특성, interface 주소,
broadcast 주소, netmask 등을 알 수 있습니다.

[EXAMPLE CODE]

#include <winsock2.h>
#include <ws2tcpip.h>
#include <iostream>

std::ostream& operator<<(std::ostream& os, const INTERFACE_INFO& ii)
{
    os << ((ii.iiFlags & IFF_UP) ? 'U' : '-');
    os << ((ii.iiFlags & IFF_BROADCAST) ? 'B' : '-');
    os << ((ii.iiFlags & IFF_LOOPBACK) ? 'L' : '-');
    os << ((ii.iiFlags & IFF_POINTTOPOINT) ? 'P' : '-');
    os << ((ii.iiFlags & IFF_MULTICAST) ? 'M' : '-');
    os << '\t' << inet_ntoa(ii.iiAddress.AddressIn.sin_addr);
    os << '\t' << inet_ntoa(ii.iiBroadcastAddress.AddressIn.sin_addr);
    os << '\t' << inet_ntoa(ii.iiNetmask.AddressIn.sin_addr);
    return os;
}

#include <algorithm>
#include <cstdlib>

int main()
{
    WSAData wsaData;
    if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
        std::cerr << "WSAStartup error\n";
        return EXIT_FAILURE;
    }

    SOCKET sd = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0);

    INTERFACE_INFO InterfaceList[16];
    DWORD nBytesReturned;
    if (WSAIoctl(sd, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList, sizeof(InterfaceList), &nBytesReturned, 0, 0) != 0) {
        std::cerr << "ioctl error\n";
        return EXIT_FAILURE;
    }

    std::copy(InterfaceList, InterfaceList + nBytesReturned / sizeof(INTERFACE_INFO), std::ostream_iterator<INTERFACE_INFO>(std::cout, "\n"));

    WSACleanup();
    return EXIT_SUCCESS;
}

[실행 예]

UB--M   192.168.0.1     255.255.255.255 255.255.255.0
UBL-M   127.0.0.1       255.255.255.255 255.0.0.0
UB-PM   211.201.125.143 255.255.255.255 255.255.255.255
|||||   ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
|||||   interface 주소  broadcast 주소      netmask
|||||
`++++-- IFF_UP           The interface is running.
 `+++-- IFF_BROADCAST    The broadcast feature is supported.
  `++-- IFF_LOOPBACK     The loopback interface is running. 
   `+-- IFF_POINTTOPOINT The interface is using point-to-point link. 
    `-- IFF_MULTICAST    The multicast feature is supported.

그나저나 "IP가 얼마"라는 표현은 흔히 쓰이지만 엄밀히는 잘못된 것이고, 정확히는 "IP 주소가 얼마"라고 해야 합니다. IP는 프로토콜일 뿐이죠. :)
byteme의 이미지

musiphil wrote:

그나저나 "IP가 얼마"라는 표현은 흔히 쓰이지만 엄밀히는 잘못된 것이고, 정확히는 "IP 주소가 얼마"라고 해야 합니다. IP는 프로토콜일 뿐이죠. :)

"IP 주소가 무엇" 이 아닐까요. IP 주소는 그저 문자열일뿐, 수량이나 정도,분량을 나타내는 말이 아니죠. :)

nthroot의 이미지

comdemo wrote:
내부 ip 쓰는 경우에는 외부로 나가는 ip와 내부에서 사용중인 ip가 다르므로 이를 구별해서 알아내야 하지 않을까요?? ^^

외부에 Echo 서버를 한대 설치하는 방법으로 알 수 있습니다.
동일한 IP가 돌아오면 공인Ip 다른 아이피가 돌아오면 사설Ip 입니다. :oops:

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

h2h1995의 이미지

Tcl로는..
다음과 같이하시면 운영체제와 상관없이.. IP어드레스를 알아내실수 있습니다.

proc getIPAddr {} { 
   set me [socket -server xxx -myaddr [info hostname] 0] 
   set ip [lindex [fconfigure $me -sockname] 0] 
   close $me 
   return $ip 
} 

tk_messageBox -message [getIPAddr]

----------------
http://tcltk.co.kr

china wholesale의 이미지

Superb! Generally I never read whole articles but the way you wrote this information is simply amazing and this kept my interest in reading and I enjoyed it.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.