CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  网络通信/分布式开发

求Delphi编写ping命令源代码!!!(万分感谢!)

楼主shipL(愚人船)2006-03-17 16:27:01 在 Delphi / 网络通信/分布式开发 提问

本人对Delphi不熟,没有用过。  
  希望各位帮帮忙,给小弟发一个用Delphi编写的实现ping命令的源代码。  
  小弟不胜感激!!谢谢了。  
   
  mail:lijslss@tom.com 问题点数:50、回复次数:4Top

1 楼ksaiy(阳光总在风雨后)回复于 2006-03-17 16:52:38 得分 10

http://www.delphibbs.com/delphibbs/dispq.asp?lid=717767Top

2 楼zhoulixing()回复于 2006-03-17 17:03:42 得分 30

使用过网络的用户都熟悉“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    
   
       WSAStartup($101,   WSAData);    
   
       //   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;    
   
       FreeMem(pRevData);    
   
       FreeMem(pIPE);    
   
       end    
   
    end;    
   
    通过上面的编程,我们就实现了Ping功能的界面操作。实际上,ICMP协议的功能还有很多,都可以通过对Icmp.dll的函数调用来实现。Top

3 楼sdzeng(大头鸟)回复于 2006-03-17 17:07:10 得分 0

浪费分,两天前有人问过Top

4 楼keiy()回复于 2006-03-17 17:16:24 得分 10

如果只要在delphi下用ping,可用indy的TIdIcmpClient构件,方法如:  
  http://www.delphibbs.com/delphibbs/dispq.asp?lid=1808169Top

相关问题

  • vb如何编写队列?源代码?
  • Delphi如何进行源代码管理?
  • Delphi实现源代码统计
  • 求ping程序的源代码。。。!
  • 求ping程序的源代码!
  • 求ping程序的源代码。。!
  • ping的源代码怎么编译
  • 我想编一个车辆管理系统。谁有delphi编写的软件(需要源代码)给我做参考?分不够还可以加。
  • 有谁会把下面的VB源代码翻译成Delphi的源代码?
  • 只求用vb编写的VCD源代码?

关键词

  • 函数
  • hicmpdll
  • icmpcreatefile
  • 句柄
  • icmpsendecho
  • prevdata
  • statusshow
  • ipopt
  • tipoptioninformation
  • icmp

得分解答快速导航

  • 帖主:shipL
  • ksaiy
  • zhoulixing
  • keiy

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo