如何获得本地的公网Ip地址

解决方案 »

  1.   

    如果是拨号上网的,请用:
    unit GetIpCon;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
    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;
    //获取所有活动的拨号连接的信息(连接句柄和设置信息)
    Function GetRasIP(RasIndex:integer):String;
    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';implementation
    Function GetRasIP(RasIndex:integer):String;var
       connections     : array[0..9] of RASCONN ; //拨号连接数组
       longSize        : dword;
       intAvailabelConnections : dword;                          //活动的拨号连接的实际数目
       intIndex        : integer;
       dwResult        : DWORD;
       dwSize          : DWORD;
       RASpppIP        : TRASPPPIP ;                             //活动的拨号连接的动态IP地址信息
    begin
       connections[ 0 ].dwSize := sizeof(RASCONN);
       longSize := 10 * connections[ 0 ].dwSize ;    //接收活动连接的缓冲区大小
       intAvailabelConnections := 0 ;                            //获取所有活动的拨号连接的信息(连接句柄和设置信息)
       dwResult := RasEnumConnections( connections[ 0 ], longSize,intAvailabelConnections );
       Result := '';
       if 0 <> dwResult then
          Result := 'Error'
       else begin
          for intIndex := 0 to intAvailabelConnections - 1 do  begin
             dwSize := SizeOf(RASpppIP);
             RASpppIP.dwSize := dwSize;
             dwResult := RASGetProjectionInfo(connections[intIndex].hRasConn,RASP_PppIp,RasPPPIP,dwSize);//获取动态IP地址
             if 0 <> dwResult then
                Result := 'Error'
             else
                Result := StrPas(RASpppIP.szIPAddress);
             end;
          end;
       end;
    end.循环一下就知道了。如果是网卡的,就用另外一个了。
      

  2.   

    通过交换机连接联通的代理服务器上internet
      

  3.   

    这个函数可以得到本地IP。
    uses
      WinSock, SysUtils;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 Startup error: %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: Invalid socket',[fd,WSAGetLastError] );
      WSACleanup;
    end;
      

  4.   

    delphi不是有IP的组件吗。用得着写代码吗?
      

  5.   

    是啊,联通的代理服务器IP地址不固定,但怎么象QQ那样得到呢
      

  6.   

    jjp(jjp)在你的碟子里,我不是已经给了答案了吗??