窓は次の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(1、1 )。 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