標籤:style blog http color io os 使用 ar for
互連網協議地址(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轉換為htonsu_short notohs ( //將網路位元組序u_short轉換為主機位元組序 u_short netshort //要轉換的u_short);
u_short htons ( //將主機位元組序u_short轉換成網路位元組序u_short host short //要轉換的u_short);
IP地址轉換 Inet_addr 與 inet_ntoaunsingned 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");}
執行結果
擷取電腦的IP地址