社区
网络通信/分布式开发
帖子详情
急用,关于ping,在线等
windowspiger
2003-10-20 08:53:35
各位大侠,谁能给出一段ping的代码?急用!
...全文
34
7
打赏
收藏
急用,关于ping,在线等
各位大侠,谁能给出一段ping的代码?急用!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sheercony
2003-10-21
打赏
举报
回复
Delphi编程实现Ping操作
张泰立
使用过网络的用户都熟悉“Ping”这个指令,它是一个DOS下的可执行文件,一般用
它来检查网络连接的好坏程度。其基本原理是利用TCP/IP协议包中ICMP协议中的一个功
能,即向所指定的计算机发送一个请求,收到请求的计算机返回一个应答,借此来判断该
计算机是否在网上运行或者检查网络连接是否稳定可靠。在Ping程序执行过程中,双方
计算机所耗费的资源都很少,因此,它是一个非常实用的工具。
我们可以通过编程来实现“Ping”操作,对其加以改进,使之具有Windows的界面
风格,显示比DOS更加直观。
首先,对编程中需要的动态链接库作一简要说明:在Windows的System目录下,你
可以找到Icmp.dll文件,该动态链接库提供了ICMP协议的所有功能,我们的编程就建立
在
对该动态链接库的调用上。
Icmp.dll文件内的调用函数说明如下:
1、IcmpCreateFile
打开一个句柄,通过该句柄你可以发送ICMP的请求回送报文。
2、IcmpCloseHandle
关闭你通过IcmpCreateFile函数打开的句柄。
3、IcmpSendEcho
通过你打开的句柄发送ICMP请求,在超时或应答报文接收后返回。其参数基本上和
它的帧结构一致,可参看下面的程序部分,其具体含意你可以参看有关ICMP协议的书
籍。
初步了解了上述的三个函数后,我们就可以开始编程了。
首先,我们的程序运行后应该有如图1所示的基本功能。为此,我们可先在Delphi的
窗口中放入右上图中所示的控件,如按钮、编辑框和文本显示框等。
(G72.JPG)
例程运行示意图
然后,在程序的开始部分(FormCreate)对WinSocket进行初始化,其作用是申明
使用的版本信息,同时调入Icmp.dll库。
type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize: Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
TIcmpCreateFile = function: THandle; stdcall;
TIcmpCloseHandle = function(IcmpHandle: THandle): Boolean;
stdcall;
TIcmpSendEcho = function(IcmpHandle:THandle;
DestinationAddress: DWORD;
RequestData: Pointer;
RequestSize: Word;
RequestOptions: PIPOptionInformation;
ReplyBuffer: Pointer;
ReplySize: DWord;
Timeout: DWord
): DWord; stdcall;
TMyPing = class(TForm)
Panel1: TPanel;
Label1: TLabel;
PingEdit: TEdit;
ExeBtn: TButton;
Button2: TButton;
Button3: TButton;
StatusShow: TMemo;
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ExeBtnClick(Sender: TObject);
private
{ Private declarations }
hICMP: THANDLE;
IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle: TIcmpCloseHandle;
IcmpSendEcho: TIcmpSendEcho;
public
{ Public declarations }
end;
procedure TMyPing.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
hICMPdll: HMODULE;
begin
?
// Load the icmp.dll stuff
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll,
'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
StatusShow.Text := '';
StatusShow.Lines.Add('目的IP地址 字节数 返回时间(毫秒)');
end;
接下来,就要进行如下所示的Ping操作的实际编程过程了。
procedure TMyPing.ExeBtnClick(Sender: TObject);
var
IPOpt:TIPOptionInformation;// IP Options for packet to send
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
begin
if PingEdit.Text <> '' then
begin
FIPAddress := inet_addr(PChar(PingEdit.Text));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hello,World';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 4000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),
@IPOpt, pIPE, BufferSize, FTimeOut);
if pReqData^ = pIPE^.Options.OptionsData^ then
begin
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' '
+IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
end;
begin
StatusShow.Lines.Add(PChar(PingEdit.Text) + ' '
+IntToStr(pIPE^.DataSize) + ' ' +IntToStr(pIPE^.RTT));
end;
FreeMem(pRevData);
FreeMem(pIPE);
end
end;
通过上面的编程,我们就实现了Ping功能的界面操作。实际上,ICMP协议的功能还
有很
多,都可以通过对Icmp.dll的函数调用来实现。
xiangwangz
2003-10-21
打赏
举报
回复
自己搞定了呀?
vagerent
2003-10-20
打赏
举报
回复
果然晕。
忘了考type
PIPOptionInformation = ^TIPOptionInformation;
TIPOptionInformation = packed record
TTL: Byte;
TOS: Byte;
Flags: Byte;
OptionsSize: Byte;
OptionsData: PChar;
end;
PIcmpEchoReply = ^TIcmpEchoReply;
TIcmpEchoReply = packed record
Address: DWORD;
Status: DWORD;
RTT: DWORD;
DataSize: Word;
Reserved: Word;
Data: Pointer;
Options: TIPOptionInformation;
end;
windowspiger
2003-10-20
打赏
举报
回复
晕。Mark.
windowspiger
2003-10-20
打赏
举报
回复
自己找到代码!浪费阿~
windowspiger
2003-10-20
打赏
举报
回复
我以前做过,不过没用控件。
procedure TForm1.FormCreate(Sender: TObject);
Var
WSAData: TWSAData;
hICMPdll: HMODULE;
begin
// Load the icmp.dll stuff
hICMPdll := LoadLibrary('icmp.dll');
@ICMPCreateFile := GetProcAddress(hICMPdll, 'IcmpCreateFile');
@IcmpCloseHandle := GetProcAddress(hICMPdll, 'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(hICMPdll, 'IcmpSendEcho');
hICMP := IcmpCreateFile;
Memo1.Text := '';
//Memo1.Lines.Add('IP地址 字节 返回(毫秒)');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
IPOpt:TIPOptionInformation;// IP Options for packet to send
FIPAddress:DWORD;
pReqData,pRevData:PChar;
pIPE:PIcmpEchoReply;// ICMP Echo reply buffer
FSize: DWORD;
MyString:string;
FTimeOut:DWORD;
BufferSize:DWORD;
Begin
screen.Cursor:=crhourglass;
if cb1.Text <> '' then
begin
FIPAddress := inet_addr(PChar(cb1.Text));
FSize := 40;
BufferSize := SizeOf(TICMPEchoReply) + FSize;
GetMem(pRevData,FSize);
GetMem(pIPE,BufferSize);
FillChar(pIPE^, SizeOf(pIPE^), 0);
pIPE^.Data := pRevData;
MyString := 'Hello,World';
pReqData := PChar(MyString);
FillChar(IPOpt, Sizeof(IPOpt), 0);
IPOpt.TTL := 64;
FTimeOut := 2000;
IcmpSendEcho(hICMP, FIPAddress, pReqData, Length(MyString),@IPOpt, pIPE, BufferSize, FTimeOut);
try
try
if pReqData^ = pIPE^.Options.OptionsData^ then
Memo1.Lines.Add(PChar(cb1.Text) + ' ' +'发送字节:'+IntToStr(pIPE^.DataSize) + ' ' +'所需时间(毫秒):'+IntToStr(pIPE^.RTT));
except
Memo1.Lines.Add('无法到达'+cb1.Text);
Exit;
end;
finally
FreeMem(pRevData);
FreeMem(pIPE);
screen.Cursor:=crdefault;
end;
end
end;
sixgj
2003-10-20
打赏
举报
回复
昏要怎么ping?
虚拟机(VMware)安装Centos后,网络配置(设定静态IP、本地主机与虚拟机互
ping
通)
虚拟机(VMware)安装Centos后,网络配置(设定静态IP、本地主机与虚拟机互
ping
通) 提示:写这篇东西的背景是:本人对计算机网络不太熟,但又遇上要配置虚拟机。本想着搭个集群环境直接就搞正事,谁知道直接卡在网络
ping
不通这里了,尴尬。后来当然去补习了一番计算机网络相关知识,很快就当场搞懂什么IP、网关、子网掩码之类的概念,后来又记不清了。经过一番百度,找到了正确的方法。现在先记录一个可行的配置过程供参考,大家平时
急用
就先按操作弄通环境,不要去考虑背后的原理。 文章目录虚拟机(VMware)安装
c语言完成的功能,求助:如何用c语言完成
ping
命令功能
求助:如何用c语言完成
ping
命令功能來源:互聯網2010-04-01 12:46:56評論分類: 電腦/網絡 >> 程序設計 >> 其他編程語言問題描述:求教高手一段代码,希望用c语言完成
ping
命令功能
急用
感激不尽!參考答案://呵呵调用个系统函数不就ok了?有兴趣的话可以加我qq,//大家一起探讨.qq:***********#include#includem...
wifi显示请求服务器超时,wifi服务器链接超时怎么回事啊
wifi服务器链接超时怎么回事啊 内容精选换一换弹性负载均衡(Elastic Load Balance)产品功能总览,为用户介绍弹性负载均衡支持的功能。一般情况下,可以使用
ping
命令简单了解某台远程服务器的延迟情况,以便大概了解访问速度情况。但有时候会发现,当
ping
某台服务器的IP时,可能会出现
ping
不通的情况,但是却可以访问,这个是怎么回事?其实是这台服务器设置经用
ping
命令。如果你使用...
xp无法访问查找工作组计算机,XP“网上邻居”、“查看工作组计算机”打不开及无法访问局...
XP“网上邻居”、“查看工作组计算机”打不开及无法访问局…在一些被优化过的XP系统或刚安装好的系统中,有时我们要访问局域网上的其他共享打印机或文件夹,需要用到网上邻居,可是有时会打不开,显示:“workgroup无法访问,您可能没有权限使用网络资源”但两台电脑都可以互相
ping
通切十分流畅,就是不能访问工作组让人十分郁闷切无从下手,就此问题我现在来给大家做个详细的讲解,希望能帮助
急用
的人们!(见下...
python+windows任务计划程序实现每日定时登录校园网
过几天要回家了,不想带电脑,但是又怕
急用
。所以打算放在寝室里一直待机,可是学校的校园网很鸡肋,每隔差不多俩天断开一次,抑郁。于是有了下面这个脚本。 1、实现原理 先插入涉及模块 import os from selenium import webdriver as web import time 1)检测网络是否正常 因为我的是校园网,所以是借助os.system通过
ping
协议来检测的。(我试过了socket模块,不是很理想,专业知识不足,这里没法解释的很清楚) def checkPC(u
网络通信/分布式开发
1,593
社区成员
32,964
社区内容
发帖
与我相关
我的任务
网络通信/分布式开发
Delphi 网络通信/分布式开发
复制链接
扫一扫
分享
社区描述
Delphi 网络通信/分布式开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章