如何用C 程式設計獲得某台機器的IP位址?

2021-03-31 08:57:01 字數 1795 閱讀 1778

如何用c++程式設計獲得某台機器的ip位址?

編譯:northtibet

圖一 getip1的執行畫面

下面是 getip1 程式的**,很簡單:

// getip1.cpp

//// 本程式報告本機上每一塊網絡卡的ip位址

// 命令列編譯命令為:

//// cl getip1.cpp wsock32.lib

//// 請一定要在環境變數中正確指定lib庫的路徑;可以執行vcvars32.bat

//#include #include #include #include int main()

//

// 獲得主機名.

//

char hostname[256];

int res = gethostname(hostname, sizeof(hostname));

if (res != 0)

printf("hostname=%s/n", hostname);

// 根據主機名獲取主機資訊.

//

hostent* phostent = gethostbyname(hostname);

if (phostent==null)

//

// 解析返回的hostent資訊.

//

hostent& he = *phostent;

printf("name=%s/naliases=%s/naddrtype=%d/nlength=%d/n",

he.h_name, he.h_aliases, he.h_addrtype, he.h_length);

sockaddr_in sa;

for (int nadapter=0; he.h_addr_list[nadapter]; nadapter++)

//

// 終止 windows sockets api

//

wsacleanup();

return 0;

}

要使用winsock,首先必須呼叫wsastartup,最後結束時不要忘了呼叫wsacleanup。要獲取ip位址,首先必須得到機器的主機名(host name),呼叫gethostname就可以實現,有了主機名,接下來呼叫gethostbyname來獲取包括ip位址在內的更多的主機資訊。gethostbyname返回乙個指向hostent資料結構的指標,這個結構在檔案中是這樣定義的:
// 來自winsock.h

struct hostent ;

這是個典型的底層apis使用的資料結構,很多人都不是很熟悉它。實際上,hostent是乙個變長的資料結構,h_name是主機名,在例子程式中的值為 "zxn.hangwire.sdb"。沒有別名(h_aliases)。h_addrtype是位址型別(或者也叫位址家族),在例子程式中的值為2(af_i*** = inter***,其它內容參見winsock.h)。h_length是每乙個位址的長度,以位元組為單位。因為ip位址的長度是4個位元組,所以在例子程式中的值為4,h_addr_list是位址陣列的開始點,它們乙個接著乙個存放,結尾是乙個null。每乙個x.y.z.w數字佔乙個位元組。為了將ip位址格式化為x.y.z.w的形式,必須將位址陣列先拷貝到乙個叫sockaddr的資料結構中,然後呼叫乙個特殊的函式i***_ntoa。 圖二是hostent 結構在記憶體中存放示意圖:

圖二 hostent 結構在記憶體中的存放示意圖

相信以上的解釋再輔以閱讀**,你以後不再會對hostent結構感到陌生。

「c#程式設計如何獲取某台機器的ip位址?」

最後,順祝程式設計愉快!

如何用C 程式設計獲得某台機器的IP位址

圖一 getip1的執行畫面 下面是 getip1 程式的 很簡單 getip1.cpp 本程式報告本機上每一塊網絡卡的ip位址 命令列編譯命令為 cl getip1.cpp wsock32.lib 請一定要在環境變數中正確指定lib庫的路徑 可以執行vcvars32.bat include inc...

如何用Request物件獲得機器的環境引數

reques物件能夠儲存從瀏覽器的客戶端傳送到伺服器的所有資訊,這當中有一部分是客戶端的環境資訊,通過reques物件就可以讀取這些資訊,從而就能夠得知客戶端的環境。servervariables 集合有哪些常用引數?要用reques物件來讀取客戶端的環境引數,就要使用到servervariable...

C 中如何得到機器的IP位址

如何使用dns類並得到機器的ip位址的技巧 介紹 這篇文章並不是技術縱覽或大型討論,而更像是關於如何得到ip位址或主機名稱的技巧集錦。在 win32 api程式設計中你可以使用 work api,在.平台中也是類似的。唯一的不同之處是你要找到並理解為完成這個任務需要什麼命名空間 namespace ...