网络编程高手,在线请教

2002past 2003-08-19 02:09:25
用DELPHI做一个可以对指定IP、端口的机子进行telnet和ftp实现人机命令交互和传送数据,如何实现用socket还是其它。
请各位大侠前来指点。
...全文
28 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
微雪缤纷 2003-11-01
  • 打赏
  • 举报
回复
看来我理解错误你问题了,如果你想对ftp进行操作的话大可用idftp就搞了,用idtelnet干什么呢?为什么一定要发送那些原ftp命令呢,当然一定要发完全可以用idftp.sentcmd搞定的(因为idftp就是靠ftp命令实现ftp的上传下载浏览操作的)。
原来理解为你要在服务器端建个ftp服务器,然后客户端要完成如自动更新数据或者程序的操作,通过idtelnet通讯告诉客户端去ftp的指定路径下载某些东西,但看看你贴的内容,好像又不是。
2002past 2003-11-01
  • 打赏
  • 举报
回复
这是我在网上找到的ICMP.DLL调用来PING的方法,我照着这个来做的时候出现了个问题:
如下:
FIPAddress := inet_addr(PChar(PingEdit.Text));
这一句中inet_addr()的功能应该是把如:192.168.0.1之类的IP地址转化成DWORD型的东东在IcmpSendEcho()里调用。这个函数应该是作者自己写的,可是如何把192.168.0.1 这种转换成DWORD型呢?
谁能实现上面这篇文章中的例子,到我的两个帖子里去报个名并写全代码,给分决不少于50分。
2002past 2003-11-01
  • 打赏
  • 举报
回复
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

   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的函数调用来实现。



《电子与电脑》 98年第5期
2002past 2003-11-01
  • 打赏
  • 举报
回复
那个问题我已经解决了,用的是INDY中的控件IDTELNET和IDFTP来做的,用IDTELNET的原因是要进行通讯,现在我的关健是问是:
我想对网络进行实时的扫描,以防止网络意外中断而程序不知道造成无限等待。有没有什么像WINDOWS系统一样,一拨掉线马上就提示网线没接好什么的。
我想用DELPHI来检测当前计算机的网络连接状态

两个方法:
1。调用ICMP来PING
2。捕获WINDOWS本机网络断开的消息。
PING呢可能会造成通讯略微下降,但是可以测到目的机器
捕获本机断开的消息对通讯速度有一点好处,只能测从本机到HUB这段路的连接,但是也能满足需要

现在问题是:
1。我不知道如何调用ICMP来PING
2。不知道如何捕获这个WINDOWS信息
微雪缤纷 2003-10-31
  • 打赏
  • 举报
回复
应该用idtcpserver和idtcpclient来通讯然后用idftp来进行大数据量,多用户的处理。
我用d6+indy9.0014实现了这些功能,具体的代码细节看demo就可以轻松搞定。
2002past 2003-10-29
  • 打赏
  • 举报
回复
最近去重庆考高程去了,一直没来关注我们的帖了,请各路英雄继续前来论谈呀!

这么久了,都想结帖了
但是又遇到几个问题,就在此再问问各位同仁吧!
1、我想对网络进行实时的扫描,以防止网络意外中断而程序不知道造成无限等待。有没有什么像WINDOWS系统一样,一拨掉线马上就提示网线没接好什么的。
2、大家都知道,DELPHI自带的打包程序打出来的是英文版的,如何做成中文的安装程序
3、如何把一个程序做成 SQL SERVER 或 金山词霸 那样,大家同行对此也很熟,想必你也知道我的意思,就不多说。也就是对任务栏的操作等。

我有两张未结的帖,合起来一百分,如果你有能力你会请参与这两个帖上,高分赠于各位同仁,记得最好是一个帖上解决一到两个问题,我好两个帖都给你分

另一帖:http://expert.csdn.net/Expert/topic/2185/2185708.xml?temp=.9295618
sevencat 2003-09-12
  • 打赏
  • 举报
回复
单单传送文件不需要用到ftp的,完全可以直接用transmitfile就能达到目的了。


传递一些消息也不需要用到telnet 这个东西,

你的功能可能是比较简单的,那也最好只用简单的socket函数好了。
用send,recv我认为就足够了(我不知道有多少木马还使用了诸如此类的控件过的。)

假如你对socket函数还不是很理解的话,建议现在先不要做这个项目,先看看有关书上的说不,可能对你帮助更大。
2002past 2003-09-12
  • 打赏
  • 举报
回复
不是木马,本程序是针对服务器的客户端程序,主要用来简单的一些如: ls cd pwd 之类的命令的,并接收服务器端返回的信息,现在的想法就是用 indy中的 Tidtelnet来实现通讯,Tidftp 来实现文件、数据的传送,请各位大侠来探讨一番。
tomyang 2003-09-11
  • 打赏
  • 举报
回复
已收到,但是还有点问题,我的要求是这样的,首先这是一个客户端程序,可以根据对方指定的IP和端口进行连接,给你一个命令输入框,你从这里向对方发送命令,如ls,并把其返回信息显示或存在某个地方,这里请说明一下返回信息和数据的是在哪个属性或函数中可以获得。
问题一旦解决高分答谢。

呵呵,你的要求很普通阿。
首先发送命令什么的应当是很简单的。但是你在目的机器上应当有一个接受的程序,用接受的程序对命令进行解析并执行并通过socket等其他方式返回结果,则实际上就是一个比较简单的木马程序,你说呢。因此复杂的地方不是客户端如何写,而是决定要完成什么功能以及在被控机器上如何完成相对功能(如:copy Screen,控制鼠标等),写个pcanywhere算了
哈哈
2002past 2003-09-05
  • 打赏
  • 举报
回复
不错,搞好的,继续努力
大家继续呀
我们的问题还没解决呢
intelligent113 2003-09-04
  • 打赏
  • 举报
回复
// ____________________________________________________将当前时间转化为合法的文件名字符串
Function TForm1.TimeToFileName(Date:TDateTime):String;
var
Present:TDateTime;
Year,Month,Day,Hour,Min,Sec,MSec:word;
begin
present:=Date;
DecodeDate(Present,Year,Month,Day);
DecodeTime(Present,Hour,Min,Sec,Msec);
result:=(IntToStr(year)+'_'+IntToStr(Month)+'_'+IntToStr(Day)+'_'+IntToStr(Hour)+'_'+IntToStr(Min)+'_'+IntToStr(Sec)+'.jpg');
end;




呵呵,小弟刚刚学delphi,写的不好,间量哦:)
chenyourkey 2003-09-03
  • 打赏
  • 举报
回复
是不是用Time()或是formatdatetime('yyyymmdd hh:mm:ss',now),好像都可以得到当前日期和时间
2002past 2003-09-01
  • 打赏
  • 举报
回复
已收到,但是还有点问题,我的要求是这样的,首先这是一个客户端程序,可以根据对方指定的IP和端口进行连接,给你一个命令输入框,你从这里向对方发送命令,如ls,并把其返回信息显示或存在某个地方,这里请说明一下返回信息和数据的是在哪个属性或函数中可以获得。
问题一旦解决高分答谢。
duxin 2003-09-01
  • 打赏
  • 举报
回复
我发了一个 查收油箱
2002past 2003-09-01
  • 打赏
  • 举报
回复
顺便问一下,有谁知道如何得到当前日期和时间的方法, 这个应该很简单,只是一时找不到,应该是某个函数就能搞定的。
limu810812 2003-08-31
  • 打赏
  • 举报
回复
俺现在也在研究网络编程。帮你顶
2002past 2003-08-31
  • 打赏
  • 举报
回复
分是一定会给的
2002past 2003-08-31
  • 打赏
  • 举报
回复
只要有价值
2002past 2003-08-31
  • 打赏
  • 举报
回复
好的,chongqingxjie@yahoo.com.cn
详细点,谢谢
duke7y 2003-08-27
  • 打赏
  • 举报
回复
socket没问题,可以解决
加载更多回复(7)

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧