|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2004/4/23 21:55:21 |
标题: |
|
加入我的收藏 |
楼主: |
请问:用DELPHI如何判断计算机是否已连接到互联网?
----------------------------------------------
- |
作者: |
|
2004/5/10 10:19:52 |
1楼: |
我想可以利用PING命令来实现,现在就是要用DELPHI编程实现PING操作。 首先,对编程中需要的动态链接库作一简要说明:在Window的System目录下,可以找到Icmp.dll文件,该动态链接库提供了ICMP协议的所有功能,我们的编程就建立在对该动态链接库的调用上。 在程序的开始部分(FormCreate)对WinSocket进行初始化,其作用是申明使用的版本信息,同时调入Icmp.dll库。 type PIPOptionInformation=^TIPOptionInformation; TIPOptionInformation=packet 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:Tpanell; 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.Line.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 buff 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’; pRevData:=PChar(MyString); FillChar(IPOpt,SizeOf(IPOpt),0); IPOpt.TTL:=64; FTimeOut:=4000; IcmpSendEcho(hIcmp,FIPAddress,pReqData,Length(MyString),@IPOpt,pIPE,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;
----------------------------------------------
-
|
作者: |
|
2004/5/10 10:27:59 |
2楼: |
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
|
|