転載:ローカルIPアドレスへのC ++のアクセス

窓は次のIPアドレスを取得するには、2つの方法があります。

IPv4およびIPv6を得るための方法が、WSAStartupの必要。

これは、IPv4だけを得るが、WSAStartupのを必要はありませんすることができます。

次のように:

方法1 :( IPv4とIPv6を得ることができます)

#define _WINSOCK_DEPRECATED_NO_WARNINGS 
する#include <Winsock2.h> 
書式#include <stdio.hに> 
する#include <iostreamの> 
の#include <CStringの> 
の#include <ws2tcpip.h>
 の#pragmaコメント(libに、 "WS2_32.LIB")   // にリンクライブラリ
使用して 名前空間はstdを、
INT get_ip()
{ 
    構造体のaddrinfo * ailist、* AIP。
    構造体のaddrinfoヒントを。
    構造体のsockaddr_in6 * sinp6。
    PHOSTENTののHostInfo。
    チャーホスト名[ 255 ] = { 0 }。// ホスト名    
    のchar *ポート= " 3294 " ;       // ポート番号
    のconst  のchar *のaddrの;
     int型ILRC; 
    のgethostname(ホスト名、はsizeof (ホスト名));
     IF((のHostInfo =のgethostbyname(ホスト名))== NULL)// ローカルIPv4アドレスを取得
    { 
        errnoに = のGetLastError()
        関数fprintf(stderrに、" のgethostbynameエラー:%D \ N- " 、エラー番号);
         リターン 1 ; 
    } 
    LPCSTR IP; 
    一方(*(hostinfo-> h_addr_list)= NULL!)// 出力IPv4アドレス
    { 
        IP = INET_NTOA(*(構造体 in_addr形式*)* hostinfo-> h_addr_list); 
        のprintf(" IPv4のアドレス=%S \ N- \ N- " 、IP ); 
        のHostInfo - > h_addr_list ++ ; 
    } 
    hint.ai_family = AF_INET6;         // 定義設けヒント 
    hint.ai_socktype = SOCK_STREAM;    // このようなソケットタイプSOCK_DGRAMとしてここ配置 
    hint.ai_flags = AI_PASSIVEに;        // フラグフラグの数。一般的に使用されるAI_CANONNAME; 
    hint.ai_protocol = 0 ;              //0に設定する一般的なプロトコル、デフォルト 
    hint.ai_addrlen = 0 ;               // 以下は0、またはNULLのように設定することはできません 
    hint.ai_canonname = NULL; 
    hint.ai_addr = NULL; 
    hint.ai_next = NULL; 
    ILRCは getaddrinfoは(ホスト名=、ポート、およびヒント、&​​ailist); // ホスト名のアドレス情報を取得
    IF(ILRC < 0 
    { 
        チャー str_error [ 100 ]; 
        strcpyの(str_error、(チャー * )gai_strerror(errnoに)); 
        のprintf(" str_error =%のS " 、str_error);
         リターン 0 ; 
    } 
    のIF(ailist == NULL)
    { 
        のprintf(" 申し訳ありませんがIPアドレスを見つけることができません、N- \してくださいもう一度やり直してください" ); 
    } 
    のために(AIP = ailist; AIP = NULL ;! = Aip- AIP>のai_next)// 取得した情報を表示
    { 
        AIP - > == ai_familyがAF_INET6; 
        sinp6 =(構造体 SOCKADDR_IN6 *)aip-> ai_addr;     // なぜ最初見下ろし、forループである
        intです。I 
        (のprintf " =のIPv6 ADDRを" のために( = I 0、Iは< 16; 私は++ 
        { 
            場合(((I- 1)%2)&&(I> 0 ))
            { 
                のprintf(" " )。
            } 
            のprintf(" %の02X "、sinp6-> sin6_addr.u.Byte [I])。
        } 
        のprintf(" の\ n " ); 
        printf(" \ nを" ); 
    } 
    一方、1 
} 
int型のmain(){ 

    WORD wVersionRequested。 
    WSADATA WSADATA。
    int型ERR; 
    wVersionRequested = MAKEWORD(11 )。
    ERR = WSAStartupの(wVersionRequested、&WSADATA)。// WS2_32.DLLを開始し、バージョンが一致し
    た場合(ERR!= 0 
    { 
        戻り 0 ; 
    } 
    場合(LOBYTE(wsaData.wVersion)=!1 ||    // バージョンが一致しない場合、ws3_32.dllの終了と終了 
        HIBYTE(wsaData.wVersion)!= 1 
    { 
        WSACleanupを()。
        リターン 0; 
    }
    get_ip(); 
    WSACleanup(); 
    リターン 0 ; 
}

方法二:( IPv4のみを考慮に入れます)

 

#_WINSOCK_DEPRECATED_NO_WARNINGS // DEFINE 
の#include <winsock2.h> 
書式#include <Iphlpapi.h> 
書式#include <iostreamの> 
使用して名前空間stdを、
(LIB、 "Iphlpapi.lib")コメントの#pragma // Iphlpapi.libライブラリを追加するために必要な
//コメントの#pragma(LIB、 "WS2_32.LIB")

INTメイン(int型ARGC、CHAR * ARGV [])
{ 
    // PIP_ADAPTER_INFOネイティブ構造ポインタメモリカード情報
    PIP_ADAPTER_INFO pIpAdapterInfo新しい新しいIP_ADAPTER_INFO =(); 
    //構造体のサイズを取得しますGetAdaptersInfoため、パラメータ
    、符号なしのロングstSizeにはsizeof(IP_ADAPTER_INFOを)= 
    //はGetAdaptersInfoがpIpAdapterInfoポインタ変数を充填関数を呼び出し、パラメータは、出力の入力の両方であることを特徴とする請求stSize 
    INT = GetAdaptersInfo NREL(pIpAdapterInfo、&stSize); 
    //レコードカード数 
    DWORD netCardNum = 0。
    GetNumberOfInterfaces(&netCardNum)。
    COUT << "NICの数:" << ENDL << netCardNum; netCardNum = 0; 
    //各カード上のIPアドレスの数を記録
    INT IPnumPerNetCard = 0; 
    IF(== ERROR_BUFFER_OVERFLOWザNREL)
    { 
        //関数が戻る場合ERROR_BUFFER_OVERFLOWは
        その広がりstSizeは、必要なスペースの量を表す//次にパラメータ渡さGetAdaptersInfoメモリ空間が不十分であり、
        //これも理由stSize入出力の両方である
        //元のメモリ空間を解放
        削除pIpAdapterInfo; 
        / /情報を格納するための全てのメモリカードを再適用
        pIpAdapterInfo =(PIP_ADAPTER_INFO)新規新しいBYTE [stSize]; 
        //関数呼び出しを再度GetAdaptersInfoがpIpAdapterInfoポインタ変数充填
        NREL = GetAdaptersInfo(pIpAdapterInfo、&stSizeが); 
    } 
        //出力カード情報
        / /そのサイクルによって判断し、複数のネットワークカードを持っていること 
    IFを( ERROR_SUCCESS == NREL)
    {裁判所未満<< "TOKENRING" <<てendl; ブレーク; 
            ケースMIB_IF_TYPE_FDDI:coutの<< "FDDI" <<てendl; ブレーク;
        しばらく(pIpAdapterInfo)
        { 
            coutの<< "网卡序号:" << ++ netCardNum << "\トン" << pIpAdapterInfo->インデックス<<てendl; 
            裁判所未満<< "网卡名称:" << pIpAdapterInfo-> AdapterName <<てendl; 
            裁判所未満<< "网卡描述:" << pIpAdapterInfo->説明<<てendl; 
            裁判所未満<< "网卡类型:"; 
            スイッチ(pIpAdapterInfo->タイプ)
            { 
            ケースMIB_IF_TYPE_OTHER:COUT << "OTHER" << ENDL。ブレーク; 
            ケースMIB_IF_TYPE_ETHERNET:coutの<< "ETHERNET" <<てendl; ブレーク; 
            ケースMIB_IF_TYPE_TOKENRING:coutの<< "
            ケースMIB_IF_TYPE_LOOPBACK:coutの<< "ループバック" <<てendl; ブレーク; 
            ケースMIB_IF_TYPE_SLIP:coutの<< "SLIP" <<てendl; ブレーク; 
            デフォルト:裁判所未満<< "" <<てendl; ブレーク; 
            } 
            COUT << "网卡MAC地址:"。
            (; iは<pIpAdapterInfo-> AddressLength I ++はDWORD I = 0)のための
                式(I <pIpAdapterInfo-> AddressLength - 1)であれば
                { 
                    のprintf( "%02X-"、pIpAdapterInfo-は> [i]のアドレス)。
                } 
                { 
                } 
            coutの<< "网卡IP地址如下:" <<てendl; 
            IPnumPerNetCard = 0;
            //複数のカードは、IPであってもよく、したがって、ループを判断する
            * =&pIpAddrString(pIpAdapterInfo-> IpAddressList)IP_ADDR_STRING; 
            DO 
            { 
                "カードのIP番号に:" COUT << <<てendl << ++ IPnumPerNetCard、
                COUT < < "IPアドレス:" << pIpAddrString-> IpAddress.String << ENDL; 
                COUT << "サブネットマスク:" << pIpAddrString-> IpMask.String << ENDL; 
                COUT << "ゲートウェイアドレス:" << pIpAdapterInfo-> GatewayList.IpAddress.String << ENDL; 
                pIpAddrString = pIpAddrString->次に; 
            }ながら(pIpAddrString); 
    } 
    //メモリ空間を解放します
            pIpAdapterInfo = pIpAdapterInfo->次に、
            裁判所未満<<「---------------------------------------------- ----------------------」<<てendl; 
        } 

    (pIpAdapterInfo)の場合
    { 
        pIpAdapterInfoを削除します。
    } 
    0を返します。
}

 

Linuxでは、以下を参照してください。http://www.cnblogs.com/lzpong/p/6956439.html

 

おすすめ

転載: www.cnblogs.com/freedomworld/p/11703456.html