DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a1871584487
今日帖子: 11
在线用户: 7
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 none_six (五更钟) ★☆☆☆☆ -
盒子活跃会员
2004/4/23 21:55:21
标题:
判断计算机是否已连接互联网? 浏览:1161
加入我的收藏
楼主: 请问:用DELPHI如何判断计算机是否已连接到互联网?
----------------------------------------------
-
作者:
男 yanlishan (yanlishan) ★☆☆☆☆ -
普通会员
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;

----------------------------------------------
-
作者:
男 willing (willing) ★☆☆☆☆ -
禁用账号
2004/5/10 10:27:59
2楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
按此在新窗口浏览图片
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行46.875毫秒 RSS