拨号上网IP地址的检知
#1
随着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,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!=0; i++)
//从主机地址表中得
//到IP地址
{
memcpy(&addr,lpHostEnt- >h_addr_list,
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>.....哦。
回复


跳转到:


正在阅读该主题的用户: 1位游客
您的访问已通过Cloudflare保护,访问自美国/loc=US。