急~我靠 快疯了 Idftp代理的问题! ( 积分: 100 )

  • 主题发起人 主题发起人 qinglan.ai
  • 开始时间 开始时间
Q

qinglan.ai

Unregistered / Unconfirmed
GUEST, unregistred user!
file1:=Tidftp.Create(nil);
IdIOHandlerSocket1:=tIdIOHandlerSocket.Create(nil);
IdSocksInfo1:=tIdSocksInfo.Create(nil);
file1.Host:='127.0.0.1';
file1.Username:='qlql';
file1.Password:='123123';
file1.Port:=21;
upfile:='c:/ftp.exe';

file1.IOHandler:=IdIOHandlerSocket1;
IdIOHandlerSocket1.SocksInfo :=IdSocksInfo1;
IdSocksInfo1.Version:=svSocks5;
IdSocksInfo1.Host:='127.0.0.1';
IdSocksInfo1.Port:=1811;
IdSocksInfo1.Username:='lanlan';
IdSocksInfo1.Password:='123123';
IdSocksInfo1.Authentication:=saUsernamePassword;
file1.ProxySettings.Host:='127.0.0.1';
file1.ProxySettings.Port:=1811;
file1.ProxySettings.UserName:='lanlan';
file1.ProxySettings.Password:='123123';
file1.ProxySettings.ProxyType:=fpcmHttpProxyWithFtp;
file1.Passive:=true;

以上代码为何实现不了socks5代理 ?sock5服务器可以连接 但是显示了一个control socket 1488 is writable 就不动了 晕死~~
 
TIdIOHandlerSocket不能被实例化,这是个abstract类,正确的方式是实例化TIdIOHandlerStack类:
IdIOHandlerSocket1:=[red]TIdIOHandlerStack[/red].Create(file1);
 
另外值得注意的是,IdFTP.IOHandler实际上只和FTP服务器做命令行通讯,真正传送文件的时候,会新增一个IOHandler来传输,所以你必须在OnDataChannelCreate事件里面,把IdSocksInfo1赋值给ADataChannel变量的SocketInfo属性:

procedure TForm1.IdFTP1DataChannelCreate(ASender: TObject; ADataChannel:
TIdTCPConnection);
begin
ADataChannel.Socket.TransparentProxy := IdSocksInfo1;
end;

注意,我用的是Indy10,部分代码可能和楼主的不同。
 
谢谢楼上两位的回答,但是我的indy式9。0的 没有TIdIOHandlerStack这个对象 那我该实例化谁呢?
 
看看帮助,或者看看源码。我已经很久没用Indy9了。不过楼主可以去Indy的Group问TeamB的Expert们,他们会解答你的问题的:
http://tech.groups.yahoo.com/group/Indy-Dev-Public/
 
后退
顶部