龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

拨号上网IP地址的检知

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
---- 随着INTERNET在世界范围内的迅速普及,上网的人数也越来越多。其中,绝大多数人是通过普通电话线拨号上网的。我们知道,每一台上网的计算机,不论是用何种方式上网,都被分配

  ---- 随着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.....哦。

  

  

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

  

  

精彩图集

赞助商链接