关于NMFTP使用代理服务器的问题

hotxu 2002-07-20 12:59:25
公司代理服务器使用Wingate。我用CuteFTP在设置防火墙以后就可以联接上FTP服务器,然而在NMFTP中设置以后却连不上。
在CuteFTP中防火墙的类型为User@站点。
NMFTP好像没有。只有FTuser,FTopen和FTSite。
请问该如何解决。用别的控件也行。只要能解决问题,如果用API最好有源码。
...全文
88 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hotxu 2002-08-31
  • 打赏
  • 举报
回复
准备结贴了,大伙再聊一聊。
ly_liuyang 2002-08-04
  • 打赏
  • 举报
回复
IndyFTP解决方法:一个TidFTP,一个TIOHandlerSocket,一个TsocksInfo,
通过属性连接起来,就是IdFTp1.IOhandler:=idIOhanlderSocket1;
idIohandlerSocket1.SocksInfo:=idSocksInfo1的意思,不必写代码的,
设置好SocksInfo的版本为Socks5,Host为代理的IP或Domain Name,Port为代理的端口,就可以让IndyFTp通过协议为Socks5的代理服务器(防火墙)连接了,当然别忘记设置好IdFTp的ProxySettings的ProxyType哦,还有其他的,关于User@站点的是要根据你的代理服务器(防火墙)的支持协议而定,一般有好几种的:Open FTP-Host:FTP-Port
SITE FTP-Host FTP-Port
SITE FTP-Host:FTP-Port
SITE FTP-User@FTP-Host FTP_port
SITE FTP-User@FTP-Host:FTP_port
USER FTP-User@FTP-Host FTP-Port
USER FTP-User@FTP-Host:FTP-Port
USER FTP-User@FTP-Host Proxy-User
USER Proxy-User@FTP-Host
CheckPoint Firewall:USER FTP-User@Proxy-User@FTP-Host / PASS pass@firewallpass
Indy只支持其中的几种,其他的自己添加。
看不懂?那是通过SendCmd的底层命令发送联接指令给代理服务器,由代理服务器解释以后,建立到外部FTP服务器的连接,因为你是不能直接连接到外部FTP的,记得就是这时一定要用Passive模式,因为你在防火墙之后,只有你可以主动访问外部,而外部不可以主动访问你,关于HTTP Proxy是怎样呢?也是差不多,就是复杂些:建立HTTP连接,通过SendCmd的底层命令发送Connect FTP:Port HTTP/1.0<CR>User-Agent: Mozilla/4.0 (compatible; LY FTP Explorer)<CR>Proxy-Connection: Keep-Alive<CR><CR>等Http信息,<CR>是回车+换行,不管通过那一种连接,连接建立以后直接发送FTP命令就可以了,注意List和上传/下载(stor/retr)的时候会建立新的连接,这时候也要用上述方法建立,否者无法成功建立新的数据端口,SendCMD是Indy的通用命令,用于发送原始的TCP数据(ASCII码的),从这里下载Indy9.0.10: http://www.nevrona.com/indy/ 还有就是Indy本身就有很多的bug,我搞了半年才修正了不少,这个最新的也有不少噢,很对不起我不能提供修正版和完整的Proxy解决办法的源代码给各位,请大家见凉。
下面是Indy9.0.10修正版的片段代码:
// added by Liu Yang 2002.2.1
fpcmSiteHostPort: // Send command SITE (FTP-Host FTP-Port)
begin
if (Length(ProxySettings.UserName)>0) then begin
if SendCmd('USER ' + ProxySettings.UserName, [230, 331]) = 331 then begin
SendCmd('PASS ' + ProxySettings.Password, 230);
end; // 230是允许的FTP协议返回代码,
//详细的看RFC 959 http://www.rfc-editor.org/rfc/rfc959.txt
end;//proxy login
SendCmd('SITE '+FHost+' '+IntToStr(FPort));//? Server Reply? 220?
if SendCmd('USER ' + FUserName, [230, 331]) = 331 then begin
SendCmd('PASS ' + FPassword, 230);
end;
end; //fpcmSiteHostPort
。。。。
fpcmUserPass: //USER user@firewalluser@hostname / PASS pass@firewallpass
begin // check point firewall / added port by Liu Yang 2002.2.2
if SendCmd(Format('USER %s@%s@%s %d',[FUserName,ProxySettings.UserName,FHost,FPort]), [230, 331])=331 then begin
if Length(ProxySettings.Password)>0 then begin
SendCmd('PASS '+FPassword+'@'+ProxySettings.Password, 230);
end
else begin
SendCmd('PASS '+FPassword, 230);
end;//if @
end;
end;//fpcmUserPass
。。。。。。
procedure TIdFTP.Connect(AAutoLogin: boolean = True);
var
TmpHost: String;
TmpPort: Integer;
begin
try
//APR 011216: proxy support
TmpHost:=FHost;
TmpPort:=FPort;
try
if (ProxySettings.ProxyType>fpcmNone) and (Length(ProxySettings.Host)>0) then begin
FHost:=ProxySettings.Host;
FPort:=ProxySettings.Port;
end;
inherited Connect;
finally
FHost:=TmpHost;
FPort:=TmpPort;
end;//tryf
// fixed by Liu Yang 2002.2.1
if ProxySettings.ProxyType=fpcmNone then
begin // non-proxy connection
GetResponse([220]);
Greeting.Assign(LastCmdResult);
end else InputBuffer.Clear; // clear buffer for using proxy to connect
if AAutoLogin then begin
Login;
DoAfterLogin;
SendTransferType;
// OpenVMS 7.1 replies with 200 instead of 215 - What does the RFC say about this?
// Fix by Liu Yang 2002.6.9 for support Cisco FTP Server (It will reply 502)
if SendCmd('SYST', [200, 215, 500, 502]) = 500 then begin
FSystemDesc := RSFTPUnknownHost;
end else begin
FSystemDesc := LastCmdResult.Text[0];
end;
DoStatus(ftpReady);
end;
except
Disconnect;
raise;
end;
end;
ly_liuyang 2002-08-04
  • 打赏
  • 举报
回复
我用IndyFTP可以的,要自己加写Http Proxy代码,就是要扩展Indy,我的FTP:http://lyhome.3322.net, Link: http://lyhome.3322.net/lysoft/lyftp.exe
试一试,要是可以的,就说明我改写成功了,那个东东5万行代码的
hotxu 2002-08-02
  • 打赏
  • 举报
回复
我使用CuteFtp连的时候,选了使用防火墙设置,就可以了。
如果不使用结果和我的程序一样。
halfdream 2002-08-01
  • 打赏
  • 举报
回复
>>我看了联上服务器了,但是在List时就出错了。
>>'425 can`t bulder data connection'

从这点可以看出,不管怎么样,能够连接出去的.只是不能让FTP服务器
向客户端再主动建一个连接而已.
在这种情况下,为什么还要设代理方式呢 ?

关于这个,同意JamesJiang(欢乐英雄)
WINGATE好象是软路由方式,而不是代理方式...
你确定CUTEFTP里面代理设置生效的吗?

hotxu 2002-07-31
  • 打赏
  • 举报
回复
我主要想知道Indy如何进行防火墙设置。因为CuteFTP只要使用了防火墙设置就可以了。
hotxu 2002-07-31
  • 打赏
  • 举报
回复
还有个问题忘了说:就是连接有的FTP站点没有问题,连接我要连接的站点就出现上述问题。
halfdream 2002-07-31
  • 打赏
  • 举报
回复
我想原因在于FTP协议的问题.
FTP要过防火墙有点特别...
FTP协议有主动方式与被动方式, 主要是建立数据传输连接的发起方不同.

NMFTP组件没有考虑那么多.
hotxu 2002-07-30
  • 打赏
  • 举报
回复
我看了联上服务器了,但是在List时就出错了。
'425 can`t bulder data connection'
hotxu 2002-07-30
  • 打赏
  • 举报
回复
我也不明白,希望大家一起研究。Indy有一个FTP的例子,如何把他改为可通过代理服务器。
JamesJiang 2002-07-30
  • 打赏
  • 举报
回复
好,就冲你这400分,我回家再把Indy再装上研究、研究,但我一直没搞清楚SOCKET3和SOCKET5的代理是什么意思,有什么区别,你清楚吗?
hotxu 2002-07-30
  • 打赏
  • 举报
回复
Indy中的IdFTP如何设置防火墙,如CutFTP中的防火墙设置,问题解决了再加200分。
我在服务器上连接一点都没有问题。
IdFTP中的socksinfo的host是指什么?
JamesJiang 2002-07-20
  • 打赏
  • 举报
回复
你的Wingate版本是多少,既然设了网关,就不需要设代理,网关是透明的,其实就是一个一端口的路由器。
hotxu 2002-07-20
  • 打赏
  • 举报
回复
我的网关就是wingate的IP,我用Indy也联不上。Indy如何设置防火墙。
hotxu 2002-07-20
  • 打赏
  • 举报
回复
我的网关就是wingate的IP,我用Indy也联不上。Indy如何设置防火墙。
JamesJiang 2002-07-20
  • 打赏
  • 举报
回复
1.Wingate有透明网关的功能,你只需要再你的机器上把IP设置里的默认网关设为Wingate机器的IP就可以与外面透明通讯,不需要设置任何代理。
2.TNMFTP性能奇差无比(抗断线,重连接能力极差),我推荐你使用Indy套间(就是以前的WinShoe)里的FTP组件,Dephi6里已经包含了这一套VCL,听说BCB6里也有了,但我还没见过BCB6,耳听不一定为实,你如果是BCB5,就去下一套好了,他好象是免费的,它应该是功能最全、功能也最强大的网络通讯VCL了,同时它还有完整的帮助文件,很好用。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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