我的程序需要在运行前检测一下网络状况,如果不能上网对我的程序将是致命的打击
所以我要在程序运行初对网络状况进行判断,我用的是DELPHI 7 我采用的是书上讲的方法 具体如下:
types:=INTERNET_CONNECTION_MODEM+
       INTERNET_CONNECTION_LAN+
       INTERNET_CONNECTION_PROXY;
IF internetGetConnectedSTATE(@TYPES,0) THEN
    EDIT1.Text :='ok'
    ELSE
     EDIT1.Text :='no';
但是有个问题,插上网线,程序可以得出OK,但是拔了网线结果仍是OK,需要过很久才才能出NO,或者干脆注销了才行,
大家有什么解决得方法 ,我在线等,或者别得方法解决也行,我得目的是 迅速对网络状况做出判断  拜托大家了!!!

解决方案 »

  1.   

    试试这个函数
    {=================================================================
      功  能:  检测网络状态
      参  数:  IpAddr: 被测试网络上机器的IP地址或名称
      返回值:  成功:  True  失败: False;
      备  注:=================================================================}
    Function CheckNet(IpAddr: string): Boolean;
    type
      PIPOptionInformation = ^TIPOptionInformation;
      TIPOptionInformation = packed record
         TTL:         Byte;      // Time To Live (used for traceroute)
         TOS:         Byte;      // Type Of Service (usually 0)
         Flags:       Byte;      // IP header flags (usually 0)
         OptionsSize: Byte;      // Size of options data (usually 0, max 40)
         OptionsData: PChar;     // Options data buffer
      end;  PIcmpEchoReply = ^TIcmpEchoReply;
      TIcmpEchoReply = packed record
         Address:       DWord;                // replying address
         Status:        DWord;                // IP status value (see below)
         RTT:           DWord;                // Round Trip Time in milliseconds
         DataSize:      Word;                 // reply data size
         Reserved:      Word;
         Data:          Pointer;              // pointer to reply data buffer
         Options:       TIPOptionInformation; // reply options
      end;  TIcmpCreateFile = function: THandle; stdcall;
      TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall;
      TIcmpSendEcho = function(
         IcmpHandle:          THandle;
         DestinationAddress:  DWord;
         RequestData:         Pointer;
         RequestSize:         Word;
         RequestOptions:      PIPOptionInformation;
         ReplyBuffer:         Pointer;
         ReplySize:           DWord;
         Timeout:             DWord
      ): DWord; stdcall;const
      Size = 32;
      TimeOut = 1000;
    var
      wsadata: TWSAData;
      Address: Integer{DWord};                     // Address of host to contact
      HostName, HostIP: String;           // Name and dotted IP of host to contact
      Phe: PHostEnt;                      // HostEntry buffer for name lookup
      BufferSize, nPkts: Integer;
      pReqData, pData: Pointer;
      pIPE: PIcmpEchoReply;               // ICMP Echo reply buffer
      IPOpt: TIPOptionInformation;        // IP Options for packet to send
    const
      IcmpDLL = 'icmp.dll';
    var
      hICMPlib: HModule;
      IcmpCreateFile : TIcmpCreateFile;
      IcmpCloseHandle: TIcmpCloseHandle;
      IcmpSendEcho:    TIcmpSendEcho;
      hICMP: THandle;                     // Handle for the ICMP Calls
    begin
      // initialise winsock
      Result:=True;
      if WSAStartup(2,wsadata) <> 0 then begin
         Result:=False;
         halt;
      end;
      // register the icmp.dll stuff
      hICMPlib := loadlibrary(icmpDLL);
      if hICMPlib <> null then begin
        @ICMPCreateFile := GetProcAddress(hICMPlib, 'IcmpCreateFile');
        @IcmpCloseHandle:= GetProcAddress(hICMPlib, 'IcmpCloseHandle');
        @IcmpSendEcho:= GetProcAddress(hICMPlib, 'IcmpSendEcho');
        if (@ICMPCreateFile = Nil) or (@IcmpCloseHandle = Nil) or (@IcmpSendEcho = Nil) then begin
            Result:=False;
            halt;
        end;
        hICMP := IcmpCreateFile;
        if hICMP = INVALID_HANDLE_VALUE then begin
          Result:=False;
          halt;
        end;
      end else begin
        Result:=False;
        halt;
      end;
    // ------------------------------------------------------------
      Address := inet_addr(PChar(IpAddr));
      if (Address = INADDR_NONE) then
      begin
        Phe := GetHostByName(PChar(IpAddr));
        if Phe = Nil then Result:=False
        else begin
          Address := longint(plongint(Phe^.h_addr_list^)^);
          HostName := Phe^.h_name;
          HostIP := StrPas(inet_ntoa(TInAddr(Address)));
        end;
      end
      else
      begin
        Phe := GetHostByAddr(@Address, 4, PF_INET);
        if Phe = Nil then Result:=False;
      end;  if Address = INADDR_NONE then
      begin
         Result:=False;
      end;
      // Get some data buffer space and put something in the packet to send
      BufferSize := SizeOf(TICMPEchoReply) + Size;
      GetMem(pReqData, Size);
      GetMem(pData, Size);
      GetMem(pIPE, BufferSize);
      FillChar(pReqData^, Size, $AA);
      pIPE^.Data := pData;
      // Finally Send the packet
      FillChar(IPOpt, SizeOf(IPOpt), 0);
      IPOpt.TTL := 64;
      NPkts := IcmpSendEcho(hICMP, Address, pReqData, Size, @IPOpt, pIPE, BufferSize, TimeOut);
      if NPkts = 0 then Result:=False;
      // Free those buffers
      FreeMem(pIPE); FreeMem(pData); FreeMem(pReqData);
    // --------------------------------------------------------------
      IcmpCloseHandle(hICMP);
      FreeLibrary(hICMPlib);
      // free winsock
      if WSACleanup <> 0 then Result:=False;
    end;