a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Delphi > 正文

Delphi中用ICMP探測遠程主機是否存活

2019-11-18 18:02:32
字體:
來源:轉載
供稿:網友
 

Delphi中用ICMP探測遠程主機是否存活

2005-03-10 jlbnet

網絡通訊中經常需要確定遠程主機是否存活,以決定下一部進行的操作。可以直接使用ICMP協議來實現,但是要考慮許多協議細節,實現起來比較麻煩。Windows 自帶的ICMP庫里有現成的函數可以使用,只要在使用前填充相應的數據結構就可以了。

以下是要使用的數據結構。這些結構MSDN里有C形式的聲明,這里給出的是Delphi的形式。

//用到的協議數據結構
  PipOptionInfo = ^TIPOptionInfo; // IP 頭選項
  TIPOptionInfo = packed record
    TTL: Byte;//存活時間
    TOS: Byte;//Type of Service,請求類型
    Flags: Byte;//標志
    OptionsSize: Byte;//選項長度
    OptionsData: PChar;//選項數據
  end;
  PIcmpEchoReply = ^TIcmpEchoReply;
  TIcmpEchoReply = packed record  // ICMP 返回信息
    Address: DWord;//IP地址
    Status: DWORD;//狀態
    RTT: DWORD;
    DataSize: Word;//數據長度
    Reserved: Word;//保留
    Data: Pointer;//數據
    Options: TIPOptionInfo;//選項區
  end;

//動態庫中的函數聲明
  TIcmpCreateFile = function: THandle; stdcall; //創建ICMP句柄
  TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall; //關閉ICMP句柄
  TIcmpSendEcho = function(IcmpHandle:THandle; DestinationAddress:DWORD;
       RequestData:Pointer; RequestSize:Word; RequestOptions:PIPOptionInfo;
       ReplyBuffer:Pointer; ReplySize:DWord; Timeout:DWord):DWord; stdcall;//發送ICMP探測數據報

//要用到的變量聲明
  hICMPDll,hICMP:THandle;
  wsaData:TWSADATA;
  ICMPCreateFile:TICMPCreateFile;
  IcmpCloseHandle:TIcmpCloseHandle;
  IcmpSendEcho:TIcmpSendEcho;

//destip:要探測的遠程地址,形如 192.168.1.1
PRocedure f_CheckOnline(destip:string);
var
  IPOpt:TIPOptionInfo;// 發包的 IP 選項
  IPAddr:DWORD;
  pReqData,pRevData:PChar;
  pIPE:PIcmpEchoReply;// ICMP Echo 回復緩沖區
  FSize: DWORD;
  MyString:string;
  FTimeOut:DWORD;
  BufferSize:DWORD;
  i:integer;
begin
  hICMPdll := LoadLibrary('icmp.dll'); //調取icmp 動態庫
  if hICMPDll<>NULL then
  begin
    WSAStartup($101,wsaData);//初始化網絡協議棧
    @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); //取動態庫中的導出函數
    @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
    @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
    hICMP := IcmpCreateFile; //創建 icmp句柄
 IPAddr:= inet_addr(PChar(destip)); //取要探測的遠端主機ip地址
   
   FSize := 40;
   BufferSize := SizeOf(TICMPEchoReply) + FSize;
   GetMem(pRevData,FSize);
   GetMem(pIPE,BufferSize);
   FillChar(pIPE^, SizeOf(pIPE^), 0);
   pIPE^.Data := pRevData;
   MyString := 'Hi, OnLine?';//任意字符串
   pReqData := PChar(MyString);
   FillChar(IPOpt, Sizeof(IPOpt), 0);
   IPOpt.TTL := 64;
   FTimeOut := 500;//等待時長
   i:=IcmpSendEcho(hICMP, IPAddr, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);//如果有返回,返回值表示收到的回復的個數。如果為0表示沒有回復,主機無法到達
   FreeMem(pRevData);
   FreeMem(pIPE);
    IcmpCloseHandle(hicmp);
    FreeLibrary(hICMPdll);//釋放動態庫
    WSAcleanup();//清理協議棧
  end;
end;


上一篇:第一次接觸Delphi

下一篇:Delphi7對XML的支持分析

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 国产综合精品一区二区三区 | 国产精品精品视频一区二区三区 | 色九九 | 欧美精品一区二区三区蜜臀 | 综合网激情 | 四虎影院最新地址 | 综合五月| 日韩中文字幕免费在线播放 | 国产综合亚洲精品一区二 | 黄色一级毛片 | 欧美二区在线 | 国产二区三区 | 国产免费网址 | 91久久国产综合久久蜜月精品 | 日韩欧美在线播放 | av在线一区二区三区 | 久久精品国产亚洲精品 | 久久综合一区二区三区 | 精品成人免费一区二区在线播放 | 日韩视频在线播放 | 91高清视频在线观看 | 一区二区三区四区免费观看 | 亚洲美女视频一区二区三区 | 在线免费观看av片 | 一区二区视频在线 | 亚洲男人的天堂在线 | 色婷婷亚洲 | 日韩中文字幕一区二区 | 国产毛片在线 | 黄色国产大片 | 国产无区一区二区三麻豆 | 亚洲欧美在线综合 | 国产精品极品美女在线观看免费 | 97精品在线视频 | 国产精品网站在线 | 国产一区二区欧美 | 毛片91| 国产欧美日韩精品一区二区三区 | 91精品一区二区三区久久久久久 | 日本黄色大片免费看 | 国产一区二区亚洲 |