如何判断adsl连接网络状态,不用ping,不用访问网页,就是通过判断ip,或其他方法,请指教。另外indy里有这样的组件吗?idipwatch不行,因为adsl的网卡的ip是不变的

解决方案 »

  1.   

    unit IPAddressTools;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';implementationFunction 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.
    如果只有一个拨号连接,直接GetRasIP(0)=''说明没有进行连接,如果不等于空说明连接了
    当然也可以for i:=0 to 10来判断