以下分別列出 Dlephi 版及 C++ 版的取得 Local IP address 範例: // // Delphi版本 (written by Huanlin Tsai) // procedure TForm1.Button1Click(Sender: TObject); var szHostName: array [0..256] of char; AWSAData: TWSAData; p_HostEnt: PHostEnt; addr: TInAddr; i: integer; p: PChar; begin Memo1.Clear; lblHostName.Caption := '(Unknown)'; if (WSAStartup(MAKEWORD(1, 1), AWSAData) <> 0) then begin ShowMessage('WSAStartup error'); Exit; end; if GetHostName(@szHostName, 256) = SOCKET_ERROR then begin lblHostName.Caption := '(Error getting host name)'; Exit; end; lblHostName.Caption := szHostName; p_HostEnt := GetHostByName(szHostName); if p_HostEnt = nil then begin ShowMessage('Bad host lookup!'); Exit; end; i := 0; while True do begin // h_addr_list 是一個指標,它指向另一個指標 // 或者說,它是一個指向字元陣列的指標 p := p_HostEnt^.h_addr_list^; if p[i] = #0 then break; Move(p[i], addr, sizeof(TInAddr)); Memo1.Lines.Add('Address ' + IntToStr(i) + ': ' + inet_ntoa(addr)); Inc(i); end; end; // // C++ 版本 (取自 Winsock FAQ) // #include #include #include int doit(int, char**) { char ac[80]; if (gethostname(ac, sizeof(ac)) == SOCKET_ERROR) { cerr << "Error " << WSAGetLastError() << " when getting local host name." << endl; return 1; } cout << "Host name is " << ac << "." << endl; struct hostent* phe = gethostbyname(ac); if (phe == 0) { cerr << "Yow! Bad host lookup." << endl; return 1; } for (int i = 0; phe->h_addr_list[i] != 0; ++i) { struct in_addr addr; memcpy(&addr, phe->h_addr_list[i], sizeof(struct in_addr)); cout << "Address " << i << ": " << inet_ntoa(addr) << endl; } return 0; } int main(int argc, char* argv[]) { WSAData wsaData; if (WSAStartup(MAKEWORD(1,1), &wsaData) != 0) return 255; int retval = doit(argc, argv); WSACleanup(); getch(); return retval; }