📄 lc_bcb_65.html
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>拨号上网IP地址的检知</title>
</head>
<body>
<div align="center">
<b>
<font size="+2">拨号上网IP地址的检知</font>
</b>
</div>
<p align="center"><font color="#333333">北京山武川仪控制系统有限公司</font><br>
<font color="#333333">王准</font>
<p><font color="#333333">---- 随着INTERNET在世界范围内的迅速普及,上网的人数也越来越多。其中,绝大多数人是通过普通电话线拨号上网的。我们知道,每一台上网的计算机,不论是用何种方式上网,都被分配了一个或多个独立无二的IP地址。对于拨号上网的用户,一般是由其ISP在其每次拨号上网时动态分配一个IP地址,这个地址可能每次都不相同(其原因主要是为了充分利用有限资源)。那么,我们能否通过某种方法随时方便地检知自己上网时的IP地址呢?答案是肯定的。下面我们就用C++BUILDER编制一个小巧的程序来实现这种功能。(注:本程序在局域网中也同样能运行)</font>
<p><font color="#333333">---- 首先用BCB的FILE菜单下的New Application创建一个新项目,取名为IPcheck.bpr。</font>
<p><font color="#333333">---- 然后,在窗体FORM1上添加五个标签(LABEL)和两个按钮(BUTTON),如图所示。</font>
<p><font color="#333333">---- 接下来,双击窗体的OnCreate事件,在其中加上以下程序:</font>
<p><font color="#333333">
void __fastcall TForm1::FormCreate(TObject *Sender)</font><br>
<font color="#333333">
{</font><br>
<font color="#333333">
WSAData wsaData;</font>
<p><font color="#333333">
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0)</font><br>
<font color="#333333">
{ //初始化WINSOCK调用</font><br>
<font color="#333333"> </font><br>
<font color="#333333">
MessageBox(NULL,"Wrong WinSock</font><br>
<font color="#333333">
Version","Error",MB_OK);</font><br>
<font color="#333333">
return ;</font><br>
<font color="#333333">
}</font>
<p><font color="#333333">
Refresh1Click(Sender); //程序一开始,就调检知IP地址</font><br>
<font color="#333333">
}</font>
<p><font color="#333333"> 再双击Refresh按钮,在其中加上以下程序</font>
<p><font color="#333333">
void __fastcall TForm1::Refresh1Click(TObject *Sender)</font><br>
<font color="#333333">
//刷新IP地址</font><br>
<font color="#333333">
{</font><br>
<font color="#333333">
char HostName[80];</font>
<p><font color="#333333">
LPHOSTENT lpHostEnt;</font>
<p><font color="#333333">
struct in_addr addr[2];</font>
<p><font color="#333333">
//本程序假设主机不是多宿主机,即最多只有</font>
<p><font color="#333333">
// 一块网卡和一个动态IP</font><br>
<font color="#333333">
for (int i=0; i< 2; i++){</font><br>
<font color="#333333">
memset(&addr[i],0,sizeof(in_addr));</font><br>
<font color="#333333">
//对in_addr结构清0,以利后面填写</font>
<p><font color="#333333">
}</font>
<p><font color="#333333">
if (gethostname(HostName,sizeof(HostName))==SOCKET_ERROR)</font>
<p><font color="#333333">
{ // 得到本主机名</font>
<p><font color="#333333">
MessageBox(NULL,"Can't getting local host
name.","Error",MB_OK);</font><br>
<font color="#333333">
return ;</font><br>
<font color="#333333">
}</font>
<p><font color="#333333">
Label3- >Caption=HostName;</font>
<p><font color="#333333">
lpHostEnt=gethostbyname(HostName);//利用得到的主机名去获得主机结构</font>
<p><font color="#333333">
if (!lpHostEnt){</font>
<p><font color="#333333">
MessageBox(NULL,"Yow! Bad host
lookup.","Error",MB_OK);</font>
<p><font color="#333333">
return ;</font>
<p><font color="#333333">
}</font>
<p><font color="#333333">
for (int i=0; lpHostEnt- >h_addr_list[i]!=0; i++)</font>
<p><font color="#333333">
//从主机地址表中得到IP地址</font>
<p><font color="#333333">
{</font>
<p><font color="#333333">
memcpy(&addr[i],lpHostEnt- >h_addr_list[i],sizeof(in_addr));</font>
<p><font color="#333333">
}</font>
<p><font color="#333333">
Label4- >Caption=inet_ntoa(addr[0]);</font>
<p><font color="#333333">
Label5- >Caption=inet_ntoa(addr[1]);</font>
<p><font color="#333333">
}</font>
<p><font color="#333333"> 再双击Refresh按钮,在其中加上以下程序</font>
<p><font color="#333333">
void __fastcall TForm1::Button2Click(TObject *Sender)</font>
<p><font color="#333333">
{</font>
<p><font color="#333333">
WSACleanup(); //释放WINSOCK调用</font>
<p><font color="#333333">
Close();</font>
<p><font color="#333333">
}</font>
<p><font color="#333333">---- 最后,不要忘了在程序头部加上#include<winsock.h>.....哦。</font>
<p><font color="#333333">----
好了,程序完成了,编译后就可运行了。本程序在中文WIN95/NT4.0下编译通过。</font><br>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -