拨号上网IP地址的检知

北京山武川仪控制系统有限公司
王准

---- 随着INTERNET在世界范围内的迅速普及，上网的人数也越来越多。其中，绝大多数人是通过普通电话线拨号上网的。我们知道，每一台上网的计算机，不论是用何种方式上网，都被分配了一个或多个独立无二的IP地址。对于拨号上网的用户，一般是由其ISP在其每次拨号上网时动态分配一个IP地址，这个地址可能每次都不相同（其原因主要是为了充分利用有限资源）。那么，我们能否通过某种方法随时方便地检知自己上网时的IP地址呢？答案是肯定的。下面我们就用C++BUILDER编制一个小巧的程序来实现这种功能。（注：本程序在局域网中也同样能运行）

---- 首先用BCB的FILE菜单下的New Application创建一个新项目，取名为IPcheck.bpr。

---- 然后，在窗体FORM1上添加五个标签（LABEL）和两个按钮(BUTTON),如图所示。

---- 接下来，双击窗体的OnCreate事件，在其中加上以下程序：

void __fastcall TForm1::FormCreate(TObject *Sender)
{
WSAData wsaData;

if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)
{ //初始化WINSOCK调用
MessageBox(NULL,"Wrong WinSock
Version","Error",MB_OK);
return ;
}

Refresh1Click(Sender); //程序一开始，就调检知IP地址
}

再双击Refresh按钮，在其中加上以下程序

void __fastcall TForm1::Refresh1Click(TObject *Sender)
//刷新IP地址
{
char HostName[80];

LPHOSTENT lpHostEnt;

struct in_addr addr[2];

//本程序假设主机不是多宿主机，即最多只有

// 一块网卡和一个动态IP
for (int i=0; i< 2; i++){
memset(&addr[i],0,sizeof(in_addr))；
//对in_addr结构清0，以利后面填写

}

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++)

//从主机地址表中得到IP地址

{

memcpy(&addr[i],lpHostEnt- >h_addr_list[i],sizeof(in_addr));

}

Label4- >Caption=inet_ntoa(addr[0]);

Label5- >Caption=inet_ntoa(addr[1]);

}

再双击Refresh按钮，在其中加上以下程序

void __fastcall TForm1::Button2Click(TObject *Sender)

{

WSACleanup(); //释放WINSOCK调用

Close();

}

---- 最后，不要忘了在程序头部加上#include<winsock.h>.....哦。

---- 好了，程序完成了，编译后就可运行了。本程序在中文WIN95/NT4.0下编译通过。