隨著網際網路的普及,撥號上網曾是大多數用戶的主要接入方式。每台連網電腦都擁有唯一的 IP 位址,而撥號用戶通常由 ISP 動態分配,每次連線的 IP 可能不同。本文示範如何使用 C++Builder 開發一個小型工具,即時偵測並顯示本機的 IP 位址,同樣適用於區域網路環境。
首先在 C++Builder 中建立新專案,命名為 IPcheck.bpr。在主視窗 Form1 上放置五個標籤(Label)與兩個按鈕(Button),分別用於顯示主機名稱、IP 位址及觸發重新整理與關閉動作。
在表單的 OnCreate 事件中初始化 WinSock,並立即呼叫重新整理函式:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
WSAData wsaData;
if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) {
MessageBox(NULL, "Wrong WinSock Version", "Error", MB_OK);
return;
}
Refresh1Click(Sender); // 程式啟動即偵測 IP
}
Refresh 按鈕的點擊事件負責取得主機名稱並解析 IP 位址:
void __fastcall TForm1::Refresh1Click(TObject *Sender)
{
char HostName[80];
LPHOSTENT lpHostEnt;
struct in_addr addr[2];
for (int i = 0; i < 2; i++)
memset(&addr[i], 0, sizeof(in_addr));
if (gethostname(HostName, sizeof(HostName)) == SOCKET_ERROR) {
MessageBox(NULL, "Can't getting local host name.", "Error", MB_OK);
return;
}
Label3->Caption = HostName;
lpHostEnt = gethostbyname(HostName);
if (!lpHostEnt) {
MessageBox(NULL, "Yow! Bad host lookup.", "Error", MB_OK);
return;
}
for (int i = 0; lpHostEnt->h_addr_list[i] != 0; i++)
memcpy(&addr[i], lpHostEnt->h_addr_list[i], sizeof(in_addr));
Label4->Caption = inet_ntoa(addr[0]);
Label5->Caption = inet_ntoa(addr[1]);
}
關閉按鈕釋放 WinSock 資源並結束程式:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
WSACleanup();
Close();
}
記得在程式碼最上方加入 #include <winsock.h>。編譯執行後,即可在中文 Windows 95/NT 4.0 環境下正常運作。