Конференция "Сети" » Как узнать, есть ли коннект к ip адресу?
 
  • Elena (02.09.10 11:12) [0]
    Проблема в том, что при посылке запросов на недоступный адрес (разными способами) машина виснет и игнорирует timeOut. Нужно проверить доступен ли ip. Пока использую ping но кривым способом - проверяю в результате вхождение строки, типа адрес недоступен. Может есть какая-то функция, типа пинг, но чтобы в ответе был Boolean? Гуглила, не нашла. Заранее спасибо!
  • brother © (02.09.10 11:19) [1]
    unit pingModule;
    interface
    uses icmp, Windows;
    const
    INADDR_NONE: integer = -1;
    procedure Ping (const Address, EchoString: PChar;var PingReply: TsmICMP_Echo_Reply;
    const PingTimeout: Integer = 500);
    function PingStatusToStr (StatusCode: integer): string;
    function inet_addr (IPAddress: PChar): TipAddr; StdCall;
    implementation
    uses Dialogs, SysUtils;
    procedure Ping (const Address, EchoString: PChar;
    var PingReply: TsmICMP_Echo_Reply;
    const PingTimeout: Integer = 500);
    var
    IPAddress: TipAddr;
    ICMPPort: THandle;
    begin
    IPAddress:= inet_addr (Address);
    if (IPAddress = INADDR_NONE) then
    begin
    raise Exception.Create ('Function call inet_addr failed. ' +
    'The IP address is probably invalid.');
    end;
    ICMPPort:= IcmpCreateFile ();
    if (ICMPPort = INVALID_HANDLE_VALUE) then
    begin
    raise Exception.Create ('Function call IcmpCreateFile failed.');
    end;
    IcmpSendEcho (ICMPPort, IPAddress,
    EchoString, Length (EchoString), nil,
    @PingReply, SizeOf (PingReply), PingTimeout);
    IcmpCloseHandle (ICMPPort);
    end;

    function PingStatusToStr (StatusCode: integer): string;
    begin
    case (StatusCode) of
    IP_SUCCESS: Result:= 'IP_SUCCESS';
    IP_BUF_TOO_SMALL: Result:= 'IP_BUF_TOO_SMALL';
    IP_DEST_NET_UNREACHABLE: Result:= 'IP_DEST_NET_UNREACHABLE';
    IP_DEST_HOST_UNREACHABLE: Result:= 'IP_DEST_HOST_UNREACHABLE';
    IP_DEST_PROT_UNREACHABLE: Result:= 'IP_DEST_PROT_UNREACHABLE';
    IP_DEST_PORT_UNREACHABLE: Result:= 'IP_DEST_PORT_UNREACHABLE';
    IP_NO_RESOURCES: Result:= 'IP_NO_RESOURCES';
    IP_BAD_OPTION: Result:= 'IP_BAD_OPTION';
    IP_HW_ERROR: Result:= 'IP_HW_ERROR';
    IP_PACKET_TOO_BIG: Result:= 'IP_PACKET_TOO_BIG';
    IP_REQ_TIMED_OUT: Result:= 'IP_REQ_TIMED_OUT';
    IP_BAD_REQ: Result:= 'IP_BAD_REQ';
    IP_BAD_ROUTE: Result:= 'IP_BAD_ROUTE';
    IP_TTL_EXPIRED_TRANSIT: Result:= 'IP_TTL_EXPIRED_TRANSIT';
    IP_TTL_EXPIRED_REASSEM: Result:= 'IP_TTL_EXPIRED_REASSEM';
    IP_PARAM_PROBLEM: Result:= 'IP_PARAM_PROBLEM';
    IP_SOURCE_QUENCH: Result:= 'IP_SOURCE_QUENCH';
    IP_OPTION_TOO_BIG: Result:= 'IP_OPTION_TOO_BIG';
    IP_BAD_DESTINATION: Result:= 'IP_BAD_DESTINATION';
    IP_ADDR_DELETED: Result:= 'IP_ADDR_DELETED';
    IP_SPEC_MTU_CHANGE: Result:= 'IP_SPEC_MTU_CHANGE';
    IP_MTU_CHANGE: Result:= 'IP_MTU_CHANGE';
    IP_UNLOAD: Result:= 'IP_UNLOAD';
    IP_GENERAL_FAILURE: Result:= 'IP_GENERAL_FAILURE';
    else
    Result:= '';
    end;
    end;

    function inet_addr; external 'WSock32.Dll';

    end.

  • brother © (02.09.10 11:20) [2]
    unit icmp;
    interface
    uses windows;
    Const
    // IP_STATUS codes returned from IP APIs

    IP_STATUS_BASE = 11000;
    IP_SUCCESS = 0;
    IP_BUF_TOO_SMALL = (IP_STATUS_BASE + 1);
    IP_DEST_NET_UNREACHABLE = (IP_STATUS_BASE + 2);
    IP_DEST_HOST_UNREACHABLE = (IP_STATUS_BASE + 3);
    IP_DEST_PROT_UNREACHABLE = (IP_STATUS_BASE + 4);
    IP_DEST_PORT_UNREACHABLE = (IP_STATUS_BASE + 5);
    IP_NO_RESOURCES = (IP_STATUS_BASE + 6);
    IP_BAD_OPTION = (IP_STATUS_BASE + 7);
    IP_HW_ERROR = (IP_STATUS_BASE + 8);
    IP_PACKET_TOO_BIG = (IP_STATUS_BASE + 9);
    IP_REQ_TIMED_OUT = (IP_STATUS_BASE + 10);
    IP_BAD_REQ = (IP_STATUS_BASE + 11);
    IP_BAD_ROUTE = (IP_STATUS_BASE + 12);
    IP_TTL_EXPIRED_TRANSIT = (IP_STATUS_BASE + 13);
    IP_TTL_EXPIRED_REASSEM = (IP_STATUS_BASE + 14);
    IP_PARAM_PROBLEM = (IP_STATUS_BASE + 15);
    IP_SOURCE_QUENCH = (IP_STATUS_BASE + 16);
    IP_OPTION_TOO_BIG = (IP_STATUS_BASE + 17);
    IP_BAD_DESTINATION = (IP_STATUS_BASE + 18);

    // The next group are status codes passed up on status indications to
    // transport layer protocols.
    IP_ADDR_DELETED = (IP_STATUS_BASE + 19);
    IP_SPEC_MTU_CHANGE = (IP_STATUS_BASE + 20);
    IP_MTU_CHANGE = (IP_STATUS_BASE + 21);
    IP_UNLOAD = (IP_STATUS_BASE + 22);
    IP_GENERAL_FAILURE = (IP_STATUS_BASE + 50);
    MAX_IP_STATUS = IP_GENERAL_FAILURE;
    IP_PENDING = (IP_STATUS_BASE + 255);

    // Values used in the IP header Flags field.
    IP_FLAG_DF = $2; // Don't fragment this packet.

    // Supported IP Option Types.
    // These types define the options which may be used in the OptionsData field
    // of the ip_option_information structure. See RFC 791 for a complete
    // description of each.
    IP_OPT_EOL = 0; // End of list option
    IP_OPT_NOP = 1; // No operation
    IP_OPT_SECURITY = $82; // Security option
    IP_OPT_LSRR = $83; // Loose source route
    IP_OPT_SSRR = $89; // Strict source route
    IP_OPT_RR = $7; // Record route
    IP_OPT_TS = $44; // Timestamp
    IP_OPT_SID = $88; // Stream ID (obsolete)

    MAX_OPT_SIZE = 40; // Maximum length of IP options in bytes

    Type

    TIPAddr=integer; // An IP address.
    TIPMask=integer; // An IP subnet mask.
    TIP_STATUS=Integer; // Status code returned from IP APIs.

    POption_Information=^TOption_Information;
    TOption_Information=record
    Ttl:byte; // Time To Live
    Tos:byte; // Type Of Service
    Flags:byte; // IP header flags
    OptionsSize:byte; // Size in bytes of options data
    OptionsData:pointer; // Pointer to options data
    end;
    Picmp_echo_reply=^Ticmp_echo_reply;
    Ticmp_echo_reply=record
    Address:TipAddr; // Replying address
    Status:integer; // Reply IP_STATUS
    RoundTripTime:integer; // RTT in milliseconds
    DataSize:word; // Reply data size in bytes
    Reserved:word; // Reserved for system use
    Data:pointer; // Pointer to the reply data
    Options:Toption_Information; // Reply options
    end;
    TsmICMP_Echo_Reply=record
    Address:TipAddr; // Replying address
    Status:integer; // Reply IP_STATUS
    RoundTripTime:integer; // RTT in milliseconds
    DataSize:word; // Reply data size in bytes
    Reserved:word; // Reserved for system use
    DataPtr:pointer; // Pointer to the reply data
    Options:Toption_Information; // Reply options
    Data: array [0..255] of Char;
    end;

    function IcmpCreateFile:Thandle; StdCall;
    function IcmpCloseHandle (H:Thandle):Bool; StdCall;
    function IcmpSendEcho (IcmpHandle:Thandle;DestinationAddress:TipAddr;
    RequestData:pointer;RequestSize:word;
    RequestOptions:POption_Information;ReplyBuffer:pointer;
    ReplySize:integer;Timeout:integer):Integer; stdcall;
    Implementation
    function IcmpCreateFile; external '
    Icmp.Dll';
    function IcmpCloseHandle; external '
    Icmp.Dll';
    Function IcmpSendEcho; external '
    Icmp.Dll';
    end.

  • brother © (02.09.10 11:21) [3]
    ...

    uses icmp, pingModule


    ...
    Ping(pchar('10.1.1.1'),nil,Reply, 500);
    500- таймаут в мск
  • brother © (02.09.10 11:31) [4]
  • Elena (02.09.10 11:47) [5]
    Спасибо! Пробую =)
  • Elena (02.09.10 11:55) [6]
    brother, спасибо огромное! Работает =) Тока в дельфе 10 надо Char на AnsiChar менять.
  • brother © (02.09.10 11:59) [7]
    > Тока в дельфе 10

    в сабже не указано ;)
  • Elena (02.09.10 12:01) [8]
    Это я на всякий случай, если кто еще будет пробовать. Проблема-то насущная.
  • cs (12.06.11 07:20) [9]
    Проблема в том, что при посылке запросов на недоступный адрес (разными способами) машина виснет и игнорирует timeOut. Нужно проверить доступен ли ip. Пока использую ping но кривым способом - проверяю в результате вхождение строки, типа адрес недоступен. Может есть какая-то функция, типа пинг, но чтобы в ответе был Boolean? Гуглила, не нашла. Заранее спасибо!
 
Конференция "Сети" » Как узнать, есть ли коннект к ip адресу?
Есть новые Нет новых   [134436   +23][b:0][p:0.003]