Delphi中用ICMP探测远程主机状态
VC++实现ping探测远程主机是否可达
1 课程设计目的(1)了解探测远程主机是否可达的方法。
(2)了解windows网络编程的基本步骤。
(3)了解TCP/IP协议及ICMP协议。
(4)掌握ping命令的思想。
(5)掌握Windows Socket API的使用方法。
2 课程设计原理ICMP:互联网控制报文协议,提供一个特殊的报文在互联网的结点之间进行监测和控制,测试目的主机是否可达,与本次课程设计目的一致,因此可模拟ICMP的工作方式来编制程序。
首先通过生成一个ICMP“回应请求”,然后将其定向至打算查询的目标主机,远程主机会拦截这个请求,然后生成一条回应答复消息,再通过网络回传给我们。
若是不能抵达目标主机,则会生成相应的错误消息。
具体步骤如下:1)创建类型为SOCK_RAW的一个套接字,同时设定协议IPPROTO_ICMP。
2)创建并初始化ICMP头。
3)调用sendto将ICMP请求发给远程主机。
4)调用recvfrom以接收ICMP响应。
其流程图如下:开始启动Winsock获取关键参数:目的主机地址创建套接字,协议字段:ICMP设置发送和接收数据最长等待时间timeout填写目的主机信息建立ICMP数据包int i=0发送和接收数据包一次,i++i<4?释放内存,关闭Winsock结束是否3程序源代码及运行结果3.1 源代码#include <winsock2.h>#include <iostream.h>#pragma comment( lib, "ws2_32.lib" )#define ICMP_ECHO 8 //回应请求类型的ICMP消息类型#define ICMP_ECHOREPLY 0 //回应答复型的ICMP消息类型#define ICMP_MIN 8 // ICMP数据报最小长度#define DEF_PACKET_SIZE 32 //默认数据报大小#define DEF_PACKET_NUMBER 4 //发送数据报的个数#define MAX_PACKET 1024 //最大ICMP数据报大小char *Ipdest; //目标主机的IP地址int datasize; //ICMP消息的长度//接收到的ICMP消息数,每收到一条ICMP消息就加1static int icmpcount=0;//IP头(20字节)struct IPHEAD{unsigned int headlength:4; // 4位头长度unsigned int version:4; // 4位版本unsigned char tos; // 8位服务类型unsigned short totallength; // 16位总长unsigned short ip_id; // 16位标识unsigned short frag_and_flags; //3个一位标识加分段偏移 unsigned char ttl; //8位存活时间unsigned char protocal; //8位协议类型unsigned short ip_checksum; //16位头校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目标IP地址};// ICMP 头(12字节)struct ICMPHEAD{unsigned char type; //类型(0,8)unsigned char code; //代码(0)unsigned short icmp_checksum; //校验和unsigned short icmp_id; //标识符unsigned short seq; //序号unsigned long timestamp; //时间戳};//Fill_icmp_data函数:用于设置ICMP头部,填充ICMP消息void Fill_icmp_data(char * icmp_data, int datasize){ICMPHEAD *icmphead=NULL;char *datapart=NULL;icmphead = (ICMPHEAD*)icmp_data;icmphead->type = ICMP_ECHO; //ICMP_ECHO=8icmphead->code = 0; //类型为8,代码为0,表示回应请求icmphead->icmp_checksum = 0;icmphead->icmp_id = (unsigned short)GetCurrentProcessId();datapart = icmp_data + sizeof(ICMPHEAD);//具体内容的首地址指针//初始化数据包内容部分for(int i=0;i<(datasize-sizeof(ICMPHEAD));i++,datapart++) *datapart=0;}//DecodeICMPHEAD函数:接受数据时从IP头中获取ICMP消息void DecodeICMPHEAD(char *recvbuf, int bread, sockaddr_in *from) {IPHEAD *iphead=NULL;ICMPHEAD *icmphead=NULL;DWORD tick;unsigned short iphdrlen;iphead = (IPHEAD *)recvbuf;//32位字的个数乘以4即字节个数iphdrlen = (iphead->headlength) * 4 ;//获取操作系统启动至今所经过的时间(ms)tick=GetTickCount();if (bread < (iphdrlen + ICMP_MIN)){cout<<"Too few bytes from: "<<inet_ntoa(from->sin_addr);cout<<endl;}icmphead = (ICMPHEAD*)(recvbuf + iphdrlen); //ICMP消息始于IP 头之后//若ICMP消息类型并非查询,则输出相应信息类型if (icmphead->type != ICMP_ECHOREPLY){cout<<"nonecho type "<<int(icmphead->type)<<" received";cout<<endl;}//确认收到的应答ICMP消息是否是对发送出去的消息的回应//若其表示与当前进程不符,则输出出错信息if (icmphead->icmp_id != (unsigned short)GetCurrentProcessId()) {cout<<"It's someone else's packet!"<<endl;return;}//输出收到信息的内容:主机地址,icmp消息序号,回应时间,存活时间cout<<"Reply from "<<inet_ntoa(from->sin_addr);cout<<" bytes="<<bread-iphdrlen;cout<<" time: "<<GetTickCount()-icmphead->timestamp<<" ms ";cout<<" seq="<<icmphead->seq;cout<<endl;icmpcount++;}//Checksum函数:用于求ICMP首部校验和unsigned short Checksum(unsigned short *buffer, int size){unsigned long cksum=0; //设校验和初值为0while(size >1){cksum+=*buffer++; //求各个16位数字之和size -=sizeof(unsigned short);}if(size){cksum += *(unsigned char*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff); //高位与低位相加cksum += (cksum >>16); //加上进位return (unsigned short)(~cksum); //取反得到校验和}//Usage函数:表示程序的功能void Usage(char *progname){cout<<"Usage:"<<progname<<" <host>"<<endl;cout<<" host remote machine to Ping"<<endl;cout<<endl;}//ValidateArgs函数:用于给目的地址和数据包大小赋值void ValidateArgs(int argc,char **argv){datasize=DEF_PACKET_SIZE; //数据包大小为DEF_PACKET_SIZE=32if(argc<2){Usage(argv[0]); //只输入一个参数:程序名Ipdest="202.119.81.120"; //默认目的地址为:202.119.81.120 }else if(argc==2)Ipdest=argv[1]; //第二个参数为目的地址}//main函数:进行建立套接字,创建ICMP头,设置超时时间,发送和接受数据等。
icmp协议常用命令
icmp协议常用命令
ICMP(Internet Control Message Protocol)是用于在IP网
络上发送控制消息的协议。
它常用于网络故障诊断和测量网络延迟。
以下是一些常用的ICMP命令:
1. ping命令,ping命令是最常用的ICMP命令之一,用于测试
与目标主机的连通性。
通过发送ICMP回显请求消息并等待目标主机
的回应来检查网络连接是否正常。
2. traceroute命令,traceroute命令用于跟踪数据包从本地
主机到目标主机的路径。
它通过发送带有不同TTL(Time to Live)值的UDP数据包,并观察返回的ICMP时间超时消息来确定数据包的
路径。
3. ping6命令,ping6命令是用于IPv6网络的ping命令版本,用于测试与IPv6目标主机的连通性。
4. mtr命令,mtr(My TraceRoute)命令结合了ping和traceroute的功能,用于连续地跟踪数据包的路径并测量到每个路
由器的延迟。
5. icmpinfo命令,icmpinfo命令用于显示有关ICMP消息类型和代码的信息。
这些命令可以帮助网络管理员诊断网络问题、测量网络性能并进行远程主机的连通性测试。
它们在日常的网络管理和故障排除中发挥着重要作用。
delphi利用ping命令测试网络状态 Ping_ZocInnetChecker
{ AsynRequest: 同步检测的话我们要有一会儿看不到对方了,呜呜 }
{ UserAgent: 想告诉Web服务器是阿猫还是阿狗在连接?在这里设置就好了 }
{ version 1.00 2005-06-03 }
{ The first version }
{ }
{ }
{ This is a freeware. If you made cool changes on it, }
{ please send them to me. }
FBusy: Boolean;
hOpenUrl, hOpen: HINTERNET;
FUserAgent: string;
FWindowHandle: HWnd;
iscCallback: INTERNET_STATUS_CALLBACK;
RC: REQUEST_CONTEXT;
end;
{ TZoCInetChecker }
procedure InternetCallback(hInternet: HINTERNET; dwContext: DWORD;
dwInternetStatus: DWORD; lpvStatusInformation: hwnd;
dwStatusInformationLength: DWORD); stdcall;
dwError: DWORD;
end;
pREQUEST_CONTEXT = ^REQUEST_CONTEXT;
REQUEST_CONTEXT = record
hWindow: HWND;
delphi调用Ping命令判断网络状态
end;
destructor Tping.destroy;
begin
FreeLibrary(hIcmpDll);
inherited destroy;
end;
procedure Tping.pinghost(ip:string;var info:string);
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize: Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
TIcmpCreateFile = function: THandle; stdcall;
Exit;
end;
FreeMem(pRevData);
FreeMem(pIPE);
end;
end;
end.
try
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),@IPOpt, pIPE, BufferSize, FTimeOut);
if pReqData^ = pIPE^.Options.OptionsData^ then
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll,'IcmpCloseHandle');
基于Delphi的远程监控系统的开发与实现
wt i h
l on e
p o l t u u 《 3 v w d c nSa 8 i 。 i o - t ] e
C l[,o C u t1 D t  ̄ e s R w on- 】 lO aT e o) w; C h 1 o C u t1 : r e o t w ; d [, w on- 】#"m T Sr ) R i  ̄o
维普资讯
14 2
福
建
电
脑
20 0 8年第 2期
基于 D lh 的远 程监控 系统 的开发 与实现 e i p
王 艳 君 ,朱 绵 庆 ,孙 彦 彦
(河 北 师 范 大 学 数 学 与 信 息科 学 学 院 河 北 石 家庄 0o 1 ) 5o6
立T cP连 接
系 统开 发 的 总体 任 务 是 实 现 远 程 监 控 。机 房 管 理 人 员 可 以 通 过 远 程 监 控 系统 对 与 服 务 器相 连 接 的 机 器 进 行 监 控 .执 行 捕 获 对 方 屏 幕 、 送信 息 、 闭对 方 计算 机等 操 作 。 发 关 本 系统 是 利 用 T PI 络 传 输 协 议 进 行 的 数 据 传 输 . 达 C/ P网 以 到 远 程 监 控 的 目的 。 由控 制 端 向被 控 端 机 器 发 出 连接 请 求 , 控 被 端 接 收 到请 求 做 出 响应 。 诉 控 制 端 已建 立 连 接 , 时 再 由 控 制 告 此 端 发 送要 执行 的命 令 。 控 端 收 到 后 执 行 该 命 令 , 将 执 行 结 果 被 并 返 回给 控 制端 。 2远 程监 控 系统 的设 计 与 实 现 . 远 程 监 控 系统 由两 部 分 组成 。 个 是 驻 留端 , 一 即运 行 在 被 控 端的程序, 另一 个 是 控 制 端 , 即运 行 在 主控 端 的程 序 。程 序 的主 要 控 件是 T evr kt T l nSc e。 Sre ̄ce 和 c eto kt i 佼 re okt 眦 e t c e 组 件 的 主 要 属 性 及 方 法 如 vr ce 和 ¥ nS kt o
用Delphi打造图形界面的Ping程序
一、 前言
在日常网络管理时,我们常用Ping命令来测试是否能与宿主是Internet信报控制协议的简写,它将报文放在一个IP数据报的数据部分中通过网络传送,该协议允许路由器向其它的路由器或者主机发送并且回收差错与控制报文,它为发生差错的路由器提供了向源端报告差错的功能。连通性测试Ping正是利用了ICMP协议的这种特性,通过向目的端(宿主)发送并且回收信报来测试端到端的连通性。
procedure TForm1.Button2Click(Sender: TObject);
begin
ListBox1.Clear ;
end;
编译上面的,一个图形化的Ping就这样轻轻松松的展现在您的面前了,是不是很酷?实际上我们还可以通过Delphi6提供的Indy控件组,实现其它的网络。自己做一下,你会发现,你在做这些时其实很简单,因为Delphi6已经为员做了许多工作。好了,大家如果有什么问题发信到romanticonline@,大家共同进步吧。
begin
ICMP.Ping ;
Application.ProcessMessages ; //延时
end;
finally
Button1.Enabled := true;
end;
end;
3、当本地计算机向宿主计算机发送一个数据包,当本地计算机接收到宿主计算机的信息时,会触发ICMPReply事件,可以在这个事件中实现对回收信息的显示或者差错等。其主要的代码段
sTime := ‘1‘
else
sTime := ‘=‘;
//在列表框中显示Ping消息
ListBox1.Items.Add(Format(‘ICMP_SEQ=%d Reply from %s [%s] : Bytes=%d time%s%d ms TTL=%d‘,
Delphi远程调试方法
Delphi远程调试方法1.问题描述:经常我们在测试程序或者排查异常时会碰到以下几种状况:(1)测试员那边有出现某种异常,可是程序员这边就是重现不了。
(2)繁体机会出现某种异常(特别是乱码问题),简体机不会。
(3)客户或者顾问电脑会出现问题,本地无法重现……针对类似上面的问题,一般我都会想总不能在测试(顾问、客户)电脑上安装一个Delphi进行调试吧,偶然发现一个解决办法,可能会解决上面的问题。
2.解决思路不可以远程连接的,准确的说是不可以ping通的,目前只有用AQTime进行跟踪了。
AQTime对于效能分析和异常分析都有很好的效果,只是安装文件有点大。
如果是测试员电脑上出现了异常,或者本地虚拟机上出现的异常,可以试着采用Delphi官方提供的远程调试方法进行调试。
配置比较啰嗦,不过都很容易懂。
下面以建档为例,描述调试步骤:(1)在远程计算机安装RDEBUG,Delphi5安装目录就有,很小,只有2-3M,简繁机都可以安装。
安装成功后运行。
(2)在本地编译出一个可以跟踪的DLL(默认编译的DLL没有跟踪信息),方法跟利用AQTime类似:Project->Options:Compile面板:去掉Optimization选项,勾上stack frames选项,勾上Debug Information选项Linker面板:Map file选择Detailed,勾上Include TD32Debug info,勾上include remotedebug symbols。
这些都配置好后,编译出DLL、map、rsm三个文件,放到客户机的相应目录。
(如果提示XXXX.drc文件找不到,把工程另存到本地就可以了)(3)配置Delphi的Run->parameters(4)跟调试本地程序一样,按F9运行,就会发现远端进程里面有个LeaderWorkCenter.exe了,然后在本地设断点,在远端开易飞,调起相应的建档,就会触发本地断点了。
用Delphi实现程序检测计算机是否连网
dwConnectionTypes:DWORD;
begin
dwConnectionTypes:=INTERNET_CONNECTION_MODEM+INTERNET_CONNECTION_LAN+INTERNET_CONNECTION_PROXY;
Result:=InternetGetConnectedState(@dwConnectionTypes,0);
}
function InternetConnected:Boolean;StdCall;
const
INTERNET_CONNECTION_MODEM=1;
INTERNET_CONNECTION_LAN=2;
INTERNET_CONNECTION_PROXY=4;
INTERNET_CONNECTION_MODEM_BUSY=8;
begin
//表示连接网络成功
end
else
//没有连接上
请注意甄别内容中的联系方式诱导购买等信息谨防诈骗
用Delphi实现程序检测计算机是否连网
用Delphi实现程序检测计算机是否连网
时间:2011-5-26来源:yang作者:peng点击:18次
1.首先在Uses中引用 wininet
2.写一个函数进行检测.代码如下:
{//功能:检测计算机是否上网
//返回值:成功:True 失败:False;
end;
3.可以在你程序中调用进行检测.如:
pbject);
begin
if InternetConnected=true then
Application.MessageBox(PChar(‘网络连接成功‘),PChar(‘系统提示‘),MB_OK+MB_ICONINFORMATION)
delphi下ping命令使用
delphi下ping命令使用要使用ping命令,首先要从indy clients 中拖出TIdIcmpClient。
亲测delphi7是可以正常设计使用下面的例子,delphi xe5则报错,即便是用7设计好然后在xe5中打开,还是不(最下面附上xe5下的代码,测试可以使用的)可能是组件有更新的缘故。
例子参考delphi7行。
基础教程第326页,唯一的改动就是我用了memo组件,原例子用的是listbox。
代码如下procedure TForm1.btn1Click(Sender: TObject);vari: integer;beginICMP.OnReply := ICMPReply;ICMP.ReceiveTimeout := 1000;btn1.Enabled := False;tryICMP.Host := edt1.Text;for i := 1 to 10 do beginICMP.Ping;Application.ProcessMessages;end;finallybtn1.Enabled := True;end;end;procedure TForm1.icmpReply(ASender: TComponent; const AReplyStatus: TReplyStatus);varsTime: string;beginif (AReplyStatus.MsRoundTripTime = 0) thensTime := '<1'elsesTime := '=';mmo1.Lines.Add(Format('%d bytes from %s: icmp_seq=%d ttl=%d time%s%d ms', [AReplyStatus.BytesReceived,AReplyStatus.FromIpAddress,AReplyStatus.SequenceId,AReplyStatus.TimeToLive,sTime,AReplyStatus.MsRoundTripTime]));end;procedure TForm1.FormCreate(Sender: TObject);beginmmo1.Clear;end;end.以下是xe5状态下的代码。
主机发现的方法及原理
主机发现的方法及原理
主机发现的方法主要基于网络探测技术,其原理是通过发送探测包到目标主机,并监听其回复来判断主机是否存活。
以下是几种常见的主机发现方法:
1. ICMP Echo请求:这是最常用的主机发现方法。
它通过发送ICMP Echo 请求包给目标主机,并等待其回复的ICMP Echo应答包。
如果收到回复,则说明目标主机是活跃的。
2. ARP Ping:ARP协议用于解析IP地址对应的MAC地址。
通过发送ARP 请求包给目标主机,并等待其回复的ARP应答包,可以判断目标主机是否存活。
3. TCP Ping:通过发送TCP SYN包给目标主机的特定端口,并等待其回复的SYN/ACK包或RST包,可以判断目标主机是否存活。
这种方法可以检测目标主机上特定应用程序的可用性。
4. UDP Ping:通过发送UDP包给目标主机,并监听其回复。
如果目标主机不处于活跃状态,则不会收到任何响应数据。
这些方法各有优缺点,可以根据实际需求选择合适的方法。
delphi icmpsendecho 参数
Delphi是一种流行的集成开发环境(IDE),用于创建Windows应用程序。
ICMP(Internet Control Message Protocol)是用于在IP 网络上进行故障排除和错误报告的协议。
icmpsendecho是Delphi中用于发送ICMP回显请求的函数,它允许开发人员测试网络连接和诊断网络问题。
在Delphi中使用icmpsendecho函数需要设置一些参数,这些参数包括目标IP位置区域、超时时间、数据缓冲区和一些其他参数。
在本文中,我们将深入探讨icmpsendecho函数的各个参数,并介绍如何在Delphi中使用它来进行网络编程。
一、目标IP位置区域icmpsendecho函数的第一个参数是目标IP位置区域,它指定了需要发送ICMP回显请求的目标主机的IP位置区域。
在Delphi中,可以通过将目标IP位置区域作为字符串传递给icmpsendecho函数来指定目标主机。
例如:```icmpsendecho('192.168.1.1', ...);```在实际应用中,开发人员需要动态获取目标IP位置区域,可以通过域名解析或者用户输入来获得目标IP位置区域,并将其传递给icmpsendecho函数。
二、超时时间icmpsendecho函数的第二个参数是超时时间,它指定了等待目标主机响应的最长时间。
如果目标主机在超时时间内未响应,icmpsendecho函数将返回错误代码。
在Delphi中,超时时间以毫秒为单位表示,例如:```icmpsendecho('192.168.1.1', 1000, ...);```上面的例子指定了超时时间为1000毫秒,即1秒钟。
在实际应用中,开发人员需要根据网络环境和要求来设置合适的超时时间。
三、数据缓冲区icmpsendecho函数的第三个参数是数据缓冲区,它用于存储发送给目标主机的数据。
在Delphi中,数据缓冲区通常是一个数组,开发人员可以指定要发送的数据内容和长度。
fpinger使用方法
fpinger使用方法fpinger是一款非常实用的网络工具,它能够帮助用户快速扫描网络中的活动主机,并提供有关主机的基本信息。
使用fpinger能够有效地检测网络中的故障节点,进行网络排错,并从中获取有关网络拓扑图的有用信息。
下面将详细介绍fpinger的使用方法。
1. 安装fpinger在使用fpinger之前,首先需要在计算机上安装fpinger。
fpinger是一款开源工具,可以从官方网站下载最新版本的安装包,并按照安装提示进行安装。
安装完成后,可以执行fpinger命令来验证是否安装成功。
2. 基本扫描要使用fpinger进行基本扫描,只需要在命令行中输入以下命令:```fpinger <IP地址范围>```其中,<IP地址范围>是待扫描的IP地址范围,可以是单个IP 地址,也可以是一个IP地址段。
例如,要扫描IP地址为192.168.0.X的所有主机,可以输入以下命令:```fpinger 192.168.0.0/24```执行命令后,fpinger会自动扫描该IP地址范围内的所有主机,并输出扫描结果。
扫描结果包括每个主机的IP地址、MAC地址、响应时间等信息。
3. 高级扫描除了基本扫描外,fpinger还支持一些高级扫描功能,如端口扫描、操作系统识别等。
端口扫描要进行端口扫描,可以使用以下命令:```fpinger -p <端口号范围> <IP地址>```其中,<端口号范围>是待扫描的端口号范围,可以是单个端口号,也可以是一个端口号范围。
例如,要扫描IP地址为192.168.0.1的主机的80端口和443端口,可以输入以下命令:```fpinger -p 80,443 192.168.0.1```操作系统识别要进行操作系统识别,可以使用以下命令:```fpinger -O <IP地址>```例如,要识别IP地址为192.168.0.1的主机的操作系统,可以输入以下命令:```fpinger -O 192.168.0.1```执行命令后,fpinger会尝试根据主机的响应特征来猜测操作系统类型,并输出识别结果。
利用ICMP请求报文探测主机操作系统
1)根据ICMP地址掩码请求探测SUN操作系统 对于ICMP地址掩码请求,只有少数操作系统会产⽣相应的应答,这些系统包括ULTRIX OpenVMS, Windows 95/98/98 SE/ME, NT below SP 4, 和 SUN Solaris机器。
但其中SUN机器对碎⽚ICMP地址掩码请求(fragmented ICMP Address Mask Requests)的应答不⼀样,所以允许远程⽤户来鉴定SUN主机操作系统。
下⾯是通过由Alfredo Andres Omella写的SING(/projects/sing)对SUN SOLARIS2.7机器正常的地址掩码请求: # ./sing -mask IP_AddressSINGing to IP_Address (IP_Address): 12 data bytes12 bytes from IP_Address: icmp_seq=0 ttl=236 mask=255.255.255.012 bytes from IP_Address: icmp_seq=1 ttl=236 mask=255.255.255.012 bytes from IP_Address: icmp_seq=2 ttl=236 mask=255.255.255.012 bytes from IP_Address: icmp_seq=3 ttl=236 mask=255.255.255.012 bytes from IP_Address: icmp_seq=4 ttl=236 mask=255.255.255.0 --- IP_Address sing statistics ---5 packets transmitted, 5 packets received, 0% packet loss 操作系统会回答⼀个ICMP的地址掩码请求并带有其响应的络地址掩码。
用Delphi实现智能化Ping命令功能
用Delphi实现智能化Ping命令功能用Delphi实现智能化Ping命令功能2007-11-08 14:21《软件报》28期众所周知,Ping命令是Windows系统自带的一个针对TCP/IP协议的可执行命令,其主要作用是通过发送数据包并接收应答信息来检测两台计算机之间的网络是否连通。
当网络出现故障时,可以用这个命令来检测故障和确定故障地点。
但在MS-DOS方式下执行此命令,而且每秒钟执行一次Ping操作,显得似乎有些另类,今天,我们将实现智能化Ping命令的功能,并实现操作的可视化。
一、系统Ping命令的功能与执行命令执行格式:Ping IP地址参数其中,参数最常用的就是-t,用于不间断Ping操作。
在执行Ping 的过程中,可以使用Pause键暂停,也可以使用Ctrl+Pause组合键显示截至当前时刻Ping操作的总次数、掉包次数以及掉包率,从而判断网络的稳定性。
Ping命令执行结果返回字节数(bytes)、执行时间(time)、生存时间(TTL)等信息。
二、编程原理Ping命令是属于ICMP协议规定的,而ICMP是内嵌于IP层的,因此,Ping是属于网络层的命令。
Ping的实现过程很简单,命令将引发IP层发送一个简单的IP包,而目的方收到这个包之后,将源和目的地址做一下交换,重新发出这个包即可。
简单来说,为了避免数据包在网路上的传送路径造成死循环或者无休止的投递下去,每个IP数据包都包含一个寿命计数器,这个就是数据包的的生存时间TTL,只要一个路由器处理过这个数据包,它就递减这个数据包的寿命计数,当寿命计数递减到0的时候,路由器就丢弃该包,TTL在一定程度上反应了一个IP数据包经过的路由器的多少。
三、编程实现在Delphi中,我们可以使用IdIcmpClient组件(位于Indy Client选项卡中)实现Ping操作。
添加此组件到窗体,再添加一个文本框控件edtHost(输入IP)、一个列表框控件Info(显示信息)、两个命令按钮btnPing(执行Ping命令)、btnStop(停止Ping命令)。
基于ICMP的主机存活性探测原理与实现
基于ICMP的主机存活性探测原理与实现1.工作原理ICMP是“InternetControlMessageProtocol"(Internet控制消息协议)的缩写。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。2.程序设计(1)设计要求通过这次设计,要求了解TCP/IP的基本协议的工作原理和基本的网络编程知识,利用单(多)线程技术、API函数等编写服务和客户端应用程序,利用MFC提供的类编写较为复杂网络应用程序。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
(2)主要代码//定义ICMP结构体。
typedef struct icmp_hdr{unsigned char icmp_type; // 消息类型unsigned char icmp_code; // 代码unsigned short icmp_checksum; // 校验和// 下面是回显头unsigned short icmp_id; // 用来惟一标识此请求的ID号,通常设置为进程ID unsigned short icmp_sequence; // 序列号unsigned long icmp_timestamp; // 时间戳} ICMP_HDR, *PICMP_HDR;typedef struct _iphdr{unsigned int h_len:4; //头长度unsigned int version:4;//IP版本unsigned char tos; //服务类型unsigned short total_len;//包的总长度unsigned short ident; //包标识身份unsigned short frag_and_flags;//标志unsigned char ttl; //包生命周期unsigned char proto; //协议类型unsigned short checksum; //IP校验unsigned int sourceIP; //源IPunsigned int destIP; //目标IP}IPHeader;//设置最长存活期BOOL CICMPDlg::SetTTL(SOCKET s, int nValue){int ret = setsockopt(s, IPPROTO_IP, IP_TTL, (char*)&nVa lue, sizeof(nValue));return ret != SOCKET_ERROR;}//设置超时时间BOOL CICMPDlg::SetTimeout(SOCKET s, int nTime, BOOL bRecv) {int ret = setsockopt(s, SOL_SOCKET,bRecv ? SO_RCVTIMEO : SO_SNDTIMEO, (char*)&nTime , sizeof(nTime));return ret != SOCKET_ERROR;}//检查校验和USHORT CICMPDlg::checksum(USHORT* buff, int size){unsigned long cksum = 0;while(size>1){cksum += *buff++;size -= sizeof(USHORT);}// 是奇数if(size){cksum += *(UCHAR*)buff;}// 将32位的chsum高16位和低16位相加,然后取反cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >> 16);return (USHORT)(~cksum);}UpdateData(true);int count=m_list.GetItemCount();char szDestIp[] = "10.0.0.2"; // 127.0.0.1WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){MessageBox("WSAStartup初始化失败。
delphi如何实现查看局域网在线主机
delphi如何实现查看局域网在线主机如何看都有那些主机在线,用DELPHI编写最佳答案:利用PING命令探测比较方便以下代码稍微修改即可在Delphi中使用TidIcmpClient控件可以非常简单的实现图形界面的Ping!新建一个工程,命名为PingGUI.dpr,窗口命名为“frmPing”,加入如下组件:lst如题,如何看都有那些主机在线,用DELPHI编写利用PING命令探测比较方便以下代码稍微修改即可在Delphi中使用TidIcmpClient控件可以非常简单的实现图形界面的Ping!新建一个工程,命名为PingGUI.dpr,窗口命名为“frmPing”,加入如下组件:lstReplies: TListBox;ICMP: TIdIcmpClient;Panel1: TPanel;btnPing: TButton;edtHost: TEdit;spnPing: TSpinEdit;Label1: TLabel;完整源代码如下:unit Main;interfaceusesWindows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,SysUtils, Classes, IdIcmpClient, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,Spin;typeTfrmPing = class(TForm)lstReplies: TListBox;ICMP: TIdIcmpClient;Panel1: TPanel;btnPing: TButton;edtHost: TEdit;spnPing: TSpinEdit;Label1: TLabel;procedure btnPingClick(Sender: TObject);procedure ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);privatepublicend;varfrmPing: TfrmPing;implementation{$R *.DFM}procedure TfrmPing.btnPingClick(Sender: TObject);vari: integer;beginICMP.OnReply := ICMPReply;ICMP.ReceiveTimeout := 1000;btnPing.Enabled := False; tryICMP.Host := edtHost.Text;for i := 1 to spnPing.Value do beginICMP.Ping;Application.ProcessMessages;end;finally btnPing.Enabled := True; end;end;procedure TfrmPing.ICMPReply(ASender: TComponent; const ReplyStatus: TReplyStatus);varsTime: string;begin// TODO: check for error on ping reply (ReplyStatus.MsgType?)if (ReplyStatus.MsRoundTripTime = 0) thensTime := <1elsesTime := =;lstReplies.Items.Add(Format(%d bytes from %s: icmp_seq=%d ttl=%d time%s%d ms,[ReplyStatus.BytesReceived,ReplyStatus.FromIpAddress,ReplyStatus.SequenceId,ReplyStatus.TimeToLive,sTime,ReplyStatus.MsRoundTripTime]));end; end.。
Delphi编程实现Ping操作
Delphi编程实现Ping操作
张泰立
【期刊名称】《电子与电脑》
【年(卷),期】1998(5)5
【摘要】使用过网络的用户都熟悉“Ping”这个指令,它是一个DOS下的可执行
文件,一般用它来检查网络连接的好坏程度。
其基本原理是利用TCP/IP协议包中ICMP协议中的一个功能,即向所指定的计算机发送一个请求,收到请求的计算机返
回一个应答,借此来判断该计算机是否在网上运行或者检查网络连接是否稳定可靠。
在Ping程序执行过程中,双方计算机所耗费的资源都很少,因此,它是一个非常实用
的工具。
【总页数】2页(P132-133)
【作者】张泰立
【作者单位】无
【正文语种】中文
【中图分类】TP311
【相关文献】
1.Delphi编程实现Excel报表自动生成和发布 [J], 冷建功;赵健
2.DELPHI编程实现与ARM控制器的多机通信 [J], 何伟飞;程汉湘;郑其彦;王弼
3.用Delphi编程实现H.264视频文件的播放 [J], 张立平
4.Delphi与Matlab混合编程实现对混凝土坝扬压力灰色模型预测 [J], 任禀洁;王
琦;李云璋;陈博
5.Delphi 编程实现 AutoCAD 二次开发断面成图 [J], 薛剑锋;徐昕;钱传俊
因版权原因,仅展示原文概要,查看原文内容请购买。
icmp timestamp request remote date disclosure
icmp timestamp request remote datedisclosure随着互联网的发展,网络安全问题越来越受到人们的关注。
其中之一就是icmp timestamp request remote date disclosure(ICMP时间戳请求远程数据泄露)这一问题。
下文将为大家详细阐述这一问题的具体内容和解决方案。
一、什么是icmp timestamp request remote date disclosure?ICMP是Internet控制消息协议的缩写,用于处理不同主机之间的通信问题。
其中一个ICMP命令是timestamp请求命令,主机可以向另一台主机发送请求,查询远程主机的当前时间戳。
这一命令本身并不存在安全问题,但是如果被黑客利用,就可能导致远程数据泄露。
二、icmp timestamp request remote date disclosure的危害icmp timestamp request remote date disclosure的危害性在于,黑客可以通过这一命令获取到远程主机的当前时间戳,进而计算出远程主机的时区和时间。
这些信息可能会被黑客用于其他违法活动,如网络攻击等。
三、解决方案为了解决icmp timestamp request remote date disclosure的问题,我们可以采取以下几个措施:1.关闭ICMP协议关闭ICMP协议是最简单的解决方法之一,但是这样做会导致一些网络故障,如无法调试、无法路由跟踪等。
2. 使用防火墙可以通过防火墙来限制收发ICMP数据包,只允许某些主机进行特定的操作。
这种方法需要使用专业的防火墙软件,对于一些小型企业来说,这样的软件比较昂贵。
3.加密通信在进行网络通信的时候,可以加密数据,从而降低数据泄露的风险。
但是这种方法需要使用专业的加密技术,对于一些小型企业来说,技术门槛较高,且费用较高。
4.控制网络访问可以通过控制网络访问权限,确保只有合法的主机可以进行ICMP 通信。
ICMP
使用ICMP协议来进行主机探测BY XUNDI--主机探测对于攻击者来将是很重要的一步,通过对主机的信息搜寻,才能很好的下一步的进攻,当然对于主机探测来说有很多方法,主机某些服务的BANNER,一些使用的应用程序,或者使用工具来检测主机,如NMAP,在WEB上有craft.co m来简单的估测主机。
下面所讲的是使用ICMP协议来探测主机,主要也是可以了解ICMP这个协议,这里最主要的也是将这个ICMP协议,呵呵。
--1,ICMP ECHO(Type 8) 和ECHO Reply (Type 0)我们使用一个ICMP ECHO数据包来探测主机地址是否存活(当然在主机没有被配置为过滤ICMP形式),通过简单的发送一个ICMP ECHO(Type 8)数据包到目标主机,如果ICMP ECHO Reply(ICMP type 0)数据包接受到,说明主机是存活状态。
如果没有就可以初步判断主机没有在线或者使用了某些过滤设备过滤了ICMP的REPLY。
|-------------------------------------------------------------| || ------ ICMP ECHO request ------ || |HOST| ——————————---> |HOST| || | A | <----------------------- | B | || | | 如果存活或者没有过滤 | | || ------ 将返回ICMP RCHO REPLY ------ || |--------------------------------------------------------------这种机制就是我们通常所用的ping命令来检测目标主机是否可以ping到。
下面是两个LINUX机器的演示:[root@xundi /root]# ping 192.168.5.5PING 192.168.5.5 (192.168.5.5) from 192.168.5.1 : 56(84) bytes of data.64 bytes from 192.168.5.5: icmp_seq=0 ttl=255 time=4.4 ms64 bytes from 192.168.5.5: icmp_seq=1 ttl=255 time=5.9 ms64 bytes from 192.168.5.5: icmp_seq=2 ttl=255 time=5.8 ms--- 192.168.5.5 ping statistics ---3 packets transmitted, 3 packets received, 0% packet lossround-trip min/avg/max = 4.4/5.3/5.9 ms下面是snort所显示的信息包 :01/26-13:16:25.746316 192.168.5.1 -> 192.168.5.5ICMP TTL:64 TOS:0x0 ID:6059ID:5721 Seq:1 ECHO89 D7 8E 38 27 63 0B 00 08 09 0A 0B 0C 0D 0E 0F ...8'c..........10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./30 31 32 33 34 35 36 37 0123456701/26-13:16:25.746638 192.168.5.5 -> 192.168.5.1ICMP TTL:255 TOS:0x0 ID:6072ID:5721 Seq:1 ECHO REPLY89 D7 8E 38 27 63 0B 00 08 09 0A 0B 0C 0D 0E 0F ...8'c..........10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F ................20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F !"#$%&'()*+,-./30 31 32 33 34 35 36 37 012345670 4 8 16 31____________________________________________________________| 8位类型 | 代码=0 | 校验和 ||_____________|______________|_____________________________|| 表示符 | 序列号 ||____________________________|_____________________________|| Option data ||__________________________________________________________|上面是ICMP ECHO request & replay报文安全建议:在你的边缘路由或者防火墙阻塞来自INTERNET的ICMP ECHO requests --2,ICMP SWEEP使用ICMP ECHO轮询多个主机称为ICMP SWEEP(或者Ping Sweep).对于小的或者中等网络使用这种方法来探测主机是一种比较可接受的行为,但对于一些大的网络如CLASS A,B,这种方法就显的比较慢,原因是Ping在处理下一个之前将会等待正在探测主机的回应。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Delphi中用ICMP探测远程主机状态2005-03-14 08:30作者:jlbnet出处:blog责任编辑:方舟
网络通讯中经常需要确定远程主机是否存活,以决定下一部进行的操作。
可以直接使用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;
关注此文的读者还看过:
返回开发频道首页。