1. 程式人生 > >獲取計算機的IP地址

獲取計算機的IP地址



網際網路協議地址(Internet Protocol Address,又譯為網際協議地址),縮寫為IP地址(IP Address)。IP地址是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址,以此來遮蔽實體地址的差異

可以通過cmd下的IPconfig命名獲取計算機中的IP地址

開啟cmd

輸入ipconfig命令

在程式設計中可以通過使用Winsock庫實現獲取IP地址

需要看幾個函式:

WSAStartup函式

函式名:WSAStartup

函式原型::int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

函式功能:初始化Winsock庫 引數: wVersionRequested:接收一個WORD型整數,低位表示主版本號,高位表示子版本號 lpWSAData:WSADATA結構指標,儲存函式獲得的Winsock資訊 sockaddr_in結構體用於儲存客戶的地址 struct sockaddr_in { short sin_family //地址族,Winsock中必須是AF_INET unsigned short sin_port    //網路位元組序的埠號 struct in_addr  //網路位元組序的IP地址 char sin_zero[8] //沒有用,只是為了增加8個位元組長度 } 使用此結構體和sockaddr結構體長度一致 scokaddr_in
用來儲存主機的地址資訊,但是主機的IP和埠必須為網路位元組序。通常人們所說的IP“192.168.0.10”, 埠80等都是主機位元組序 網路位元組序和主機位元組序之間的轉換 短整型轉換notohs轉換為htons u_short notohs (    //將網路位元組序u_short轉換為主機位元組序     u_short netshort   //要轉換的u_short ); u_short  htons (       //將主機位元組序u_short轉換成網路位元組序 u_short   host short   //要轉換的u_short ); IP地址轉換   Inet_addr  與  inet_ntoa
unsingned  long   inet_addr(   //將字串(例如"192.168.0.10")轉換為u_long型別 const    char FAR *cp ); char FAR * inet_ntoa (   //精sockaddr_in結構體中的sin_addr轉換為字串 struct   in_addr in ); 程式程式碼
#include <stdio.h>
#include <winsock2.h>

//連線Winsock庫
#pragma comment(lib, "ws2_32.lib")

void main()
{
    //呼叫WSAtartup初始化Winsock庫
    WSADATA wsaData;
    ::WSAStartup(
        MAKEWORD(2,2),//版本號為2.2
        &wsaData
        );

    char szHost[256];//存放主機名的緩衝區

    ::gethostname(szHost, 256);//取得本地主機名稱

    hostent *pHost = ::gethostbyname(szHost);//通過主機名得到地址資訊

    //一個主機可能有多個網絡卡、多個IP、下面的程式碼輸出所有的IP地址
    in_addr addr;

    for(int i=0; ; i++)
    {
        //獲得地址(網路位元組)
        char *p = pHost->h_addr_list[i];

        if(NULL == p)
        {
            break;//退出迴圈
        }

        //將地址拷貝到in_addr結構體中
        memcpy(&addr.S_un.S_addr, p, pHost->h_length);

        //將in_addr轉換為主機位元組序
        char *strIP = ::inet_ntoa(addr);

        //列印IP地址
        printf("本機IP[%d]: %s\n", i+1, strIP);
    }

    //列印主機名
    printf("主機名:%s\n", szHost);

    system("pause");
}

執行結果