CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

IP地址读取问题?

楼主baal_zf((西狂))2002-06-05 00:42:31 在 C++ Builder / 基础类 提问

我的机器是用宽带上网的  
  装了宽带的enter   net后   就会产生一个虚拟的和拨号差不多的连接  
  就会动态的分配一个IP   地址  
  如果自己的网卡   自己也分配一个IP   那么读出来的就是自己网卡的IP  
  请问如何读取上网服务器动态分配的IP地址!!!谢谢 问题点数:100、回复次数:16Top

1 楼tiger_qi(老虎)回复于 2002-06-05 00:56:54 得分 20

给你一个例子把  
   
  不知道是否可以  
   
  extern     "C"     __declspec(dllexport)   LPCSTR     __stdcall     GetIp()  
  {//only   can   get   one   IP   address  
          LPCSTR   ip;  
              WORD   wVersionRequested;  
              WSADATA   wsaData;  
              char   name[255];  
   
              PHOSTENT   hostinfo;  
              wVersionRequested   =   MAKEWORD(   2,   0   );  
   
              if   (   WSAStartup(   wVersionRequested,   &wsaData   )   ==   0   )  
              {  
   
                          if(   gethostname   (   name,   sizeof(name))   ==   0)  
                          {  
                                      if((hostinfo   =   gethostbyname(name))   !=   NULL)  
                                      {  
                                                  ip   =   inet_ntoa   (*(struct   in_addr   *)*hostinfo->h_addr_list);  
   
   
                                      }  
                          }  
                          WSACleanup(   );  
   
              }  
                  return     ip;  
   
   
  }Top

2 楼baal_zf((西狂))回复于 2002-06-05 00:59:56 得分 0

我用了  
  读出的是   自己网卡的IP     谢谢Top

3 楼tiger_qi(老虎)回复于 2002-06-05 01:05:01 得分 0

哦,那看来要好好研究了,我会关注这个问题的:)Top

4 楼zzzsssccc(今天正为明天后悔)回复于 2002-06-05 08:48:01 得分 3

好像有点难度  
  用一个测连接来访用户的程序探测Top

5 楼Keng(白朗)回复于 2002-06-05 08:55:57 得分 0

请问朋友tiger_qi(老虎)    
  你有相关的WSA的资料吗?Top

6 楼RedProgramer(TST : RedSteel)回复于 2002-06-05 08:59:33 得分 5

关注一下Top

7 楼tiger_qi(老虎)回复于 2002-06-05 21:35:47 得分 0

Keng(白朗)   (      
   
   
  wsa的资料我的都丢了,在以前的公司有;)  
   
  我可以留意找找,如果找到给你  
   
  Top

8 楼tiger_qi(老虎)回复于 2002-06-05 21:36:30 得分 0

Keng(白朗)   (      
   
   
  wsa的资料我的都丢了,在以前的公司有;)  
   
  我可以留意找找,如果找到给你  
   
  Top

9 楼slwqw(四大名捕之追杀令)回复于 2002-06-05 22:32:09 得分 20

可以,看下面的代码:  
   
  AnsiString   __fastcall   GetIPAddress()  
  {  
      WSADATA   data;  
      int   Ret0;  
      AnsiString   IPAddrStr0;  
   
      Ret0=WSAStartup(MAKEWORD(2,0),&data);  
      if(Ret0==0)  
      {  
          char   host[128];  
          int   Ret1=gethostname(host,128);  
   
          if(Ret1==0)  
          {  
              struct   hostent   *pHost;  
   
              pHost=gethostbyname(host);  
              if(pHost!=NULL)  
              {  
                  char*   TrueAddrStr;  
   
                  if(pHost->h_addr_list[0]!=NULL)             //   网卡   NIC  
                  {  
                      if(pHost->h_addr_list[1]!=NULL)         //   静态PPP/IP  
                      {  
                          if(pHost->h_addr_list[2]!=NULL)     //   动态PPP/IP  
                              TrueAddrStr=pHost->h_addr_list[2];  
                          else  
                              TrueAddrStr=pHost->h_addr_list[1];  
                      }  
                      else  
                          TrueAddrStr=pHost->h_addr_list[0];  
   
                      IPAddrStr0=AnsiString(inet_ntoa(*((struct   in_addr*)(TrueAddrStr))));  
                  }  
                  else   IPAddrStr0="127.0.0.1";  
              }  
          }  
      }  
      WSACleanup();  
   
      return   IPAddrStr0;  
  }  
  Top

10 楼huzhangyou(信仰(http://www.libing.net.cn))回复于 2002-06-05 22:45:35 得分 0

上面的可以  
  呵呵  
  Top

11 楼781014(城北的风)回复于 2002-06-06 23:20:39 得分 0

以前好象有人问过。Top

12 楼baal_zf((西狂))回复于 2002-06-07 02:06:23 得分 0

根本不行  
  取出的是本机IP地址Top

13 楼pp616(坏蛋)回复于 2002-06-07 21:16:08 得分 2

:)Top

14 楼cg1120(代码最优化-§惟坚韧者始能遂其志§)回复于 2002-06-12 18:49:03 得分 50

在WIN9X下,如果安装了拨号网络,则在WINDOWS系统的系统目录System下将有两个拨号网络管理程序库RasApi32.DLL和RasApi16.DLL,我们可利用其中的RAS系列函数来获取和设置拨号连接网络的信息。当然是可以获取拨号连接的动态IP地址了。在Delphi帮助文件中,有相关RAS函数的详细说明。  
   
  ----   一、先解释一些要用到的数据常量和数据结构。  
   
  const  
   
  RAS_MaxDeviceType   =   16;//设备类型名称长度  
   
  RAS_MaxEntryName   =   256;//连接名称最大长度  
   
  RAS_MaxDeviceName   =   128;//设备名称最大长度  
   
  RAS_MaxIpAddress   =   15;//IP地址的最大长度  
   
  RASP_PppIp   =   $8021;//拨号连接的协议类型,该数值表示PPP连接  
   
  type  
   
  HRASCONN   =   DWORD;//拨号连接句柄的类型  
   
  RASCONN   =   record//活动的拨号连接的句柄和设置信息  
   
  dwSize   :   DWORD;//该结构所占内存的大小(Bytes),  
   
  一般设置为SizeOf(RASCONN)  
   
  hrasconn   :   HRASCONN;//活动连接的句柄  
   
  szEntryName   :   array[0..RAS_MaxEntryName]   of   char;  
   
  //活动连接的名称  
   
  szDeviceType   :   array[0..RAS_MaxDeviceType]   of   char;  
   
  //活动连接的所用的设备类型  
   
  szDeviceName   :   array[0..RAS_MaxDeviceName]   of   char;  
   
  //活动连接的所用的设备名称  
   
  end;  
   
  TRASPPPIP   =   record//活动的拨号连接的动态IP地址信息  
   
  dwSize   :   DWORD;//该结构所占内存的大小(Bytes),  
   
  一般设置为SizeOf(TRASPPPIP)  
   
  dwError   :   DWORD;//错误类型标识符  
   
  szIpAddress   :   array[   0..RAS_MaxIpAddress   ]   of   char;  
   
  //活动的拨号连接的IP地址  
   
  end;  
   
  ----   二、接着要解释要用到的两个RAS函数。  
   
  //获取所有活动的拨号连接的信息(连接句柄和设置信息)  
   
  function   RasEnumConnections(   var   lprasconn   :   RASCONN   ;  
   
  //接收活动连接的缓冲区的指针  
   
  var   lpcb:   DWORD;//缓冲区大小  
   
  var   lpcConnections   :   DWORD//实际的活动连接数  
   
  )   :   DWORD;   stdcall;  
   
  function   RasEnumConnections;external   'Rasapi32.dll'  
   
  name   'RasEnumConnectionsA';  
   
  //获取指定活动的拨号连接的动态IP信息  
   
  function   RasGetProjectionInfo(  
   
  hrasconn   :   HRasConn;//指定活动连接的句柄  
   
  rasprojection   :   DWORD;//RAS连接类型  
   
  var   lpprojection   :   TRASPPPIP;//接收动态IP信息的缓冲区  
   
  var   lpcb   :   DWord//接收缓冲区的大小  
   
  )   :   DWORD;stdcall;  
   
  function   RasGetProjectionInfo;external  
   
  'Rasapi32.dll'   name   'RasGetProjectionInfoA';  
   
    这两个函数的返回值为0时表示执行成功,非0表示错误代码。  
   
  ----   三、下面要讨论如何用上面的两个RAS函数获取拨号连接的动态IP地址  
   
  ----     首先,要用函数RasEnumConnections列出已建立的活动拨号连接的信息,其中包括连接名称、连接句柄、连接设备类型和设备名称;然后根据连接句柄用函数RasGetProjectionInfo获取连接对应的一个TRASPPPIP结构,其中包括一个成员属性szIpAddress即为动态IP地址。具体请参见以下程序片段和注释信息。  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
   
  const  
   
  MaxConnections   =   10;//假设最多有10个活动的拨号连接  
   
  var  
   
  connections   :   array[0..MaxConnections-1]   of   RASCONN;  
   
  //拨号连接数组  
   
  longSize   :   dword;  
  intAvailabelConnections   :   dword;  
   
  //活动的拨号连接的实际数目  
   
  intIndex   :   integer;  
  strTemp   :   string;  
  dwResult   :   DWORD;  
  dwSize   :   DWORD;  
  RASpppIP   :   TRASPPPIP;  
   
  //活动的拨号连接的动态IP地址信息  
   
  begin  
  connections[   0   ].dwSize   :=   sizeof(RASCONN);  
  longSize   :=   MaxConnections   *   connections[   0   ].dwSize;  
   
  //接收活动连接的缓冲区大小  
   
  intAvailabelConnections   :=   0;  
   
  //获取所有活动的拨号连接的信息(连接句柄和设置信息)  
   
  dwResult   :=   RasEnumConnections(   connections[   0   ],longSize,intAvailabelConnections   );  
   
  if   0   <   >   dwResult   then  
    memo1.lines.add(   '错误:'   +   inttostr(   dwResult   )   )  
  else  
  begin  
  memo1.lines.add(   '现有的活动连接有'   +IntToStr(   intAvailabelConnections   )   +   '个');  
   
  //显示所有活动的拨号连接的信息(设置信息和动态IP地址)  
   
  for   intIndex   :=   0   to   intAvailabelConnections   -   1   do  
  begin  
   
  //显示一个活动的拨号连接的设置信息  
   
  strTemp   :=   '连接名称:'+   StrPAS(   connections[   intIndex   ].szEntryName   )+   ',设备类型:'+   StrPAS(   connections[   intIndex   ].szDeviceType   )+   ',设备名称:'+   StrPAS(   connections[   intIndex   ].szDeviceName   );  
  memo1.lines.add(   strTemp   );  
   
  //显示一个活动的拨号连接的动态IP地址  
   
  dwSize   :=   SizeOf(RASpppIP);  
  RASpppIP.dwSize   :=   dwSize;  
  dwResult   :=   RASGetProjectionInfo(   connections[   intIndex   ].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//获取动态IP地址  
  if   0   <   >   dwResult   then  
    memo1.lines.add('错误:'   +   inttostr(   dwResult   ))  
  else  
  memo1.lines.add('动态地址:'   +   StrPas(RASpppIP.szIPAddress));  
  end;  
  end;  
   
  end;  
   
  以上程序在PWIN98+Delphi3.0下调试通过。    
   
  Top

15 楼slwqw(四大名捕之追杀令)回复于 2002-06-12 19:57:20 得分 0

真奇怪,我也是用ADSL上网,但我贴给你的代码同样能读出动态IP地址。  
   
  实在不行就这样吧,反正最后一个肯定是动态IP地址:  
   
  AnsiString   IPStr;  
   
  for(int   i=10;i   >=0;i--)  
  {  
      if(pHost->h_addr_list[i]!=NULL)  
      {  
          IPStr=AnsiString(pHost->h_addr_list[i]);  
          break;    
      }    
  }  
  Top

16 楼slwqw(四大名捕之追杀令)回复于 2002-06-12 19:58:28 得分 0

顺便说一下:   cg1120(代码最优化-§人在爱情的空窗期要个梦§)   (     )   的代码只对拨号上网有效,对ADSL是没有用的。Top

相关问题

  • 读取服务器上的所有IP地址?
  • 10分求怎样读取本地机器的 IP 地址。
  • 如何全部读取网络邻居列举的计算机的IP地址?
  • 我是新手,求教,如果根据IP地址读取网卡的MAC值?
  • asp.net读取mac地址
  • 如何读取IIS中默认站点的IP地址属性,请看这个示例
  • 如何通过IP地址读取另一台计算机上的VF6的DBF数据表?
  • 怎样读取网卡的MAC地址?
  • vb中怎样按地址读取值?
  • 怎样读取网卡的mac地址?

关键词

  • 连接
  • 函数
  • ip
  • 拨号
  • 句柄
  • phost
  • 地址
  • hrasconn
  • intavailabelconnections
  • raspppip

得分解答快速导航

  • 帖主:baal_zf
  • tiger_qi
  • zzzsssccc
  • RedProgramer
  • slwqw
  • pp616
  • cg1120

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo