CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

如何获得本机在公网的ip地址(连接方式为 adsl + hub)

楼主hufeng711(adfasdfad)2005-06-02 10:53:43 在 Delphi / 数据库相关 提问

如何获得本机在公网的ip地址(连接方式为   adsl   +   hub) 问题点数:0、回复次数:3Top

1 楼47522341(睡到8:30)回复于 2005-06-02 14:38:34 得分 0

【一下代码来自大富翁论坛】  
  获取本地IP地址   uses   WinSock,   SysUtils;  
   
  ……   type   ESockUtilErr   =   Class(Exception);  
  …………   function   GetLocalIpAddress   :   string;   type   pu_long   =   ^u_long;    
   var   varTWSAData   :   TWSAData;    
   varPHostEnt   :   PHostEnt;    
   varTInAddr   :   TInAddr;   namebuf   :   Array[0..255]   of   char;    
   fd   :   integer;   rc   :   integer;    
  begin    
   result   :=   "";    
   rc   :=   WSAStartup($101,varTWSAData);    
   if   rc   <>   0   then   raise   ESockUtilErr.CreateFmt(   "WSA启动错误:   %d",[rc]   )    
  else    
  begin    
   gethostname(namebuf,sizeof(namebuf));    
   varPHostEnt   :=   gethostbyname(namebuf);  
   varTInAddr.S_addr   :=   u_long(pu_long(varPHostEnt^.h_addr_list^)^);  
   result   :=   inet_ntoa(varTInAddr);  
  end;  
   fd   :=   WinSock.Socket(   PF_INET,   SOCK_STREAM,   0   );  
   if   fd   =   INVALID_SOCKET   then   raise   ESockUtilErr.CreateFmt(   "%d   %d:   无效 socket",[fd,WSAGetLastError]   );    
   WSACleanup;  
  end;  
  Top

2 楼47522341(睡到8:30)回复于 2005-06-02 14:39:41 得分 0

function   LocalIP   :   string;    
  type    
          TaPInAddr   =   array   [0..10]   of   PInAddr;    
          PaPInAddr   =   ^TaPInAddr;    
  var    
          phe     :   PHostEnt;    
          pptr   :   PaPInAddr;    
          Buffer   :   array   [0..63]   of   char;    
          I         :   Integer;    
          GInitData             :   TWSADATA;    
  begin    
          WSAStartup($101,   GInitData);    
          Result   :=   ``;    
          GetHostName(Buffer,   SizeOf(Buffer));    
          phe   :=GetHostByName(buffer);    
          if   phe   =   nil   then   Exit;    
          pptr   :=   PaPInAddr(Phe^.h_addr_list);    
          I   :=   0;    
          while   pptr^[I]   <>   nil   do   begin    
              result:=StrPas(inet_ntoa(pptr^[I]^));    
              Inc(I);    
          end;    
          WSACleanup;    
  end;  
     
     
  来自:redgum,   时间:2001-8-30   20:40:00,   ID:609598      
  (ipconfig)   or   (winipcfg)  
     
     
  来自:飞来石,   时间:2001-9-3   21:24:00,   ID:610641      
  uses   Winsock;  
   
   
  ...  
   
   
  function   getIPs:   TStrings;  
   
  type  
   
  TaPInAddr   =   Array[0..10]   of   PInAddr;  
   
  PaPInAddr   =   ^TaPInAddr;  
   
  var  
   
  phe:   PHostEnt;  
   
  pptr:   PaPInAddr;  
   
  Buffer:   Array[0..63]   of   Char;  
   
  I:   Integer;  
   
  GInitData:   TWSAData;  
   
  begin  
   
  WSAStartup($101  
   
  GInitData);  
   
  Result:=TStringList.Create;  
   
  Result.Clear;  
   
  GetHostName(Buffer  
   
  SizeOf(Buffer));  
   
  phe   :=   GetHostByName(buffer);  
   
  if   phe   =   nil   then  
   
  begin  
   
  Exit;  
   
  end;  
   
  pPtr   :=   PaPInAddr(phe^.h_addr_list);  
   
  I   :=   0;  
   
  while   pPtr^[I]   <>   nil   do  
   
  begin  
   
  Result.Add(inet_ntoa(pptr^[I]^));  
   
  Inc(I);  
   
  end;  
   
  WSACleanup;  
   
  end;  
   
     
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
   
  begin  
   
  memo1.Lines:=GetIps;  
   
  end;  
     
  Top

3 楼47522341(睡到8:30)回复于 2005-06-02 14:40:53 得分 0

我对网络先天恐惧;呵呵;所以没有测试;楼主自己测一下看看  
  ----     在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;  
   
  Top

相关问题

  • 取本机IP
  • 如何取得本机IP?
  • 用WINSOCK读出本机IP?
  • 如何获取本机IP?
  • 如何知道本机ip
  • 获取本机ip地址
  • 如何获取本机IP
  • 关于获取本机IP
  • 如何获取本机名和本机ip??
  • 急问如何得到本机的IP地址和本机名

关键词

  • 连接
  • 函数
  • ip
  • 拨号
  • 句柄
  • hrasconn
  • intavailabelconnections
  • raspppip
  • traspppip
  • papinaddr

得分解答快速导航

  • 帖主:hufeng711

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

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