以下分別列出 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;
}
               (
geocities.com/huanlin_tsai)