国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

Delphi中用ICMP探測(cè)遠(yuǎn)程主機(jī)是否存活

2019-11-18 18:02:32
字體:
供稿:網(wǎng)友
 

Delphi中用ICMP探測(cè)遠(yuǎn)程主機(jī)是否存活

2005-03-10 jlbnet

網(wǎng)絡(luò)通訊中經(jīng)常需要確定遠(yuǎn)程主機(jī)是否存活,以決定下一部進(jìn)行的操作??梢灾苯邮褂肐CMP協(xié)議來實(shí)現(xiàn),但是要考慮許多協(xié)議細(xì)節(jié),實(shí)現(xiàn)起來比較麻煩。Windows 自帶的ICMP庫(kù)里有現(xiàn)成的函數(shù)可以使用,只要在使用前填充相應(yīng)的數(shù)據(jù)結(jié)構(gòu)就可以了。

以下是要使用的數(shù)據(jù)結(jié)構(gòu)。這些結(jié)構(gòu)MSDN里有C形式的聲明,這里給出的是Delphi的形式。

//用到的協(xié)議數(shù)據(jù)結(jié)構(gòu)
  PipOptionInfo = ^TIPOptionInfo; // IP 頭選項(xiàng)
  TIPOptionInfo = packed record
    TTL: Byte;//存活時(shí)間
    TOS: Byte;//Type of Service,請(qǐng)求類型
    Flags: Byte;//標(biāo)志
    OptionsSize: Byte;//選項(xiàng)長(zhǎng)度
    OptionsData: PChar;//選項(xiàng)數(shù)據(jù)
  end;
  PIcmpEchoReply = ^TIcmpEchoReply;
  TIcmpEchoReply = packed record  // ICMP 返回信息
    Address: DWord;//IP地址
    Status: DWORD;//狀態(tài)
    RTT: DWORD;
    DataSize: Word;//數(shù)據(jù)長(zhǎng)度
    Reserved: Word;//保留
    Data: Pointer;//數(shù)據(jù)
    Options: TIPOptionInfo;//選項(xiàng)區(qū)
  end;

//動(dòng)態(tài)庫(kù)中的函數(shù)聲明
  TIcmpCreateFile = function: THandle; stdcall; //創(chuàng)建ICMP句柄
  TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean; stdcall; //關(guān)閉ICMP句柄
  TIcmpSendEcho = function(IcmpHandle:THandle; DestinationAddress:DWORD;
       RequestData:Pointer; RequestSize:Word; RequestOptions:PIPOptionInfo;
       ReplyBuffer:Pointer; ReplySize:DWord; Timeout:DWord):DWord; stdcall;//發(fā)送ICMP探測(cè)數(shù)據(jù)報(bào)

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

//destip:要探測(cè)的遠(yuǎn)程地址,形如 192.168.1.1
PRocedure f_CheckOnline(destip:string);
var
  IPOpt:TIPOptionInfo;// 發(fā)包的 IP 選項(xiàng)
  IPAddr:DWORD;
  pReqData,pRevData:PChar;
  pIPE:PIcmpEchoReply;// ICMP Echo 回復(fù)緩沖區(qū)
  FSize: DWORD;
  MyString:string;
  FTimeOut:DWORD;
  BufferSize:DWORD;
  i:integer;
begin
  hICMPdll := LoadLibrary('icmp.dll'); //調(diào)取icmp 動(dòng)態(tài)庫(kù)
  if hICMPDll<>NULL then
  begin
    WSAStartup($101,wsaData);//初始化網(wǎng)絡(luò)協(xié)議棧
    @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); //取動(dòng)態(tài)庫(kù)中的導(dǎo)出函數(shù)
    @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
    @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
    hICMP := IcmpCreateFile; //創(chuàng)建 icmp句柄
 IPAddr:= inet_addr(PChar(destip)); //取要探測(cè)的遠(yuǎn)端主機(jī)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;//等待時(shí)長(zhǎng)
   i:=IcmpSendEcho(hICMP, IPAddr, pReqData, Length(MyString), @IPOpt, pIPE, BufferSize, FTimeOut);//如果有返回,返回值表示收到的回復(fù)的個(gè)數(shù)。如果為0表示沒有回復(fù),主機(jī)無法到達(dá)
   FreeMem(pRevData);
   FreeMem(pIPE);
    IcmpCloseHandle(hicmp);
    FreeLibrary(hICMPdll);//釋放動(dòng)態(tài)庫(kù)
    WSAcleanup();//清理協(xié)議棧
  end;
end;


上一篇:第一次接觸Delphi

下一篇:Delphi7對(duì)XML的支持分析

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 会理县| 临桂县| 福鼎市| 含山县| 襄汾县| 武威市| 博白县| 台中市| 临汾市| 肇东市| 三门县| 唐海县| 五寨县| 华亭县| 顺平县| 太康县| 永新县| 惠水县| 榆社县| 江川县| 沂水县| 印江| 东明县| 精河县| 宁阳县| 永靖县| 苗栗市| 大田县| 正定县| 民和| 东兰县| 云梦县| 尚义县| 富民县| 岱山县| 佛山市| 阿克苏市| 东海县| 东阿县| 常宁市| 淮滨县|