人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細頁面

Delphi中用ICMP探測遠程主機狀態(tài)

Delphi中用ICMP探測遠程主機狀態(tài)

更新時間:2022-09-10 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):

網(wǎng)絡(luò)通訊中經(jīng)常需要確定遠程主機是否存活,以決定下一部進行的操作。可以直接使用ICMP協(xié)議來實現(xiàn),但是要考慮許多協(xié)議細節(jié),實現(xiàn)起來比較麻煩。Windows 自帶的ICMP庫里有現(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 頭選項
TIPOptionInfo = packed record
TTL: Byte;//存活時間
TOS: Byte;//Type of Service,請求類型
Flags: Byte;//標志
OptionsSize: Byte;//選項長度
OptionsData: PChar;//選項數(shù)據(jù)
end;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record // ICMP 返回信息
Address: DWORD;//IP地址
Status: DWORD;//狀態(tài)
RTT: DWORD;
DataSize: Word;//數(shù)據(jù)長度
Reserved: Word;//保留
Data: Pointer;//數(shù)據(jù)
Options: TIPOptionInfo;//選項區(qū)
end;

//動態(tài)庫中的函數(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探測數(shù)據(jù)報

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

//destip:要探測的遠程地址,形如 192.168.1.1
procedure f_CheckOnline(destip:string);
 var
  IPOpt:TIPOptionInfo;// 發(fā)包的 IP 選項
  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 動態(tài)庫
  if hICMPDll<>NULL then
   begin
    WSAStartup($101,wsaData);//初始化網(wǎng)絡(luò)協(xié)議棧
    @ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile'); //取動態(tài)庫中的導(dǎo)出函數(shù)
    @IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
    @IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
    hICMP := IcmpCreateFile; //創(chuàng)建 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);//如果有返回,返回值表示收到的回復(fù)的個數(shù)。如果為0表示沒有回復(fù),主機無法到達
    FreeMem(pRevData);
    FreeMem(pIPE);
    IcmpCloseHandle(hicmp);
    FreeLibrary(hICMPdll);//釋放動態(tài)庫
    WSAcleanup();//清理協(xié)議棧
  end;
end; 

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 衡阳市| 红河县| 方城县| 抚宁县| 囊谦县| 盘山县| 遵化市| 石嘴山市| 河北省| 松江区| 嘉义市| 宁安市| 漠河县| 淳化县| 太仆寺旗| 石门县| 高陵县| 邯郸县| 新竹市| 台前县| 万安县| 永靖县| 涿鹿县| 翁牛特旗| 陆良县| 德令哈市| 织金县| 建阳市| 扎赉特旗| 鄯善县| 壤塘县| 聂拉木县| 三亚市| 西盟| 三原县| 揭西县| 宣威市| 北辰区| 临朐县| 杭州市| 枞阳县|