IdFtp connectㄉ問題....... |
尚未結案
|
whalala
一般會員 發表:10 回覆:6 積分:3 註冊:2002-05-08 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
|
whalala
一般會員 發表:10 回覆:6 積分:3 註冊:2002-05-08 發送簡訊給我 |
|
qoo1234
版主 發表:256 回覆:1167 積分:659 註冊:2003-02-24 發送簡訊給我 |
參考以下文章: 公司代理伺服器使用Wingate。我用CuteFTP在設置防火牆以後就可以聯接上FTP伺服器,然而在NMFTP中設置以後卻連不上。
在CuteFTP中防火牆的類型為User@站點。
NMFTP好像沒有。只有FTuser,FTopen和FTSite。
請問該如何解決。用別的元件也行。只要能解決問題,如果用API最好有源碼。
--------------------------------------------------------------- 1.Wingate有透明網關的功能,你只需要再你的機器上把IP設置裡的預設網關設為Wingate機器的IP就可以與外面透明通訊,不需要設置任何代理。
2.TNMFTP性能奇差無比(抗斷線,重連接能力極差),我推薦你使用Indy套間(就是以前的WinShoe)裡的FTP元件,Dephi6里已經包含了這一套VCL,聽說BCB6里也有了,但我還沒見過BCB6,耳聽不一定為實,你如果是BCB5,就去下一套好了,他好像是免費的,它應該是功能最全、功能也最強大的網路通訊VCL了,同時它還有完整的幫助檔案,很好用。
--------------------------------------------------------------- 你的Wingate版本是多少,既然設了網關,就不需要設代理,網關是透明的,其實就是一個一端口的路由器。
--------------------------------------------------------------- 好,就衝你這400分,我回家再把Indy再裝上研究、研究,但我一直沒搞清楚SOCKET3和SOCKET5的代理是什麼意思,有什麼區別,你清楚嗎?
--------------------------------------------------------------- 我想原因在於FTP協議的問題.
FTP要過防火牆有點特別...
FTP協議有主動方式與被動方式, 主要是建立資料傳輸連接的發起方不同. NMFTP元件沒有考慮那麼多.
--------------------------------------------------------------- >>我看了聯上伺服器了,但是在List時就出錯了。
>>'425 can't bulder data connection' 從這點可以看出,不管怎麼樣,能夠連接出去的.只是不能讓FTP伺服器
向客戶端再主動建一個連接而已.
在這種情況下,為什麼還要設代理方式呢 ? 關於這個,同意JamesJiang(歡樂英雄)
WINGATE好像是軟路由方式,而不是代理方式...
你確定CUTEFTP裡面代理設置生效的嗎? --------------------------------------------------------------- 我用IndyFTP可以的,要自己加寫Http Proxy程式碼,就是要擴展Indy,我的FTP:http://lyhome.3322.net, Link: http://lyhome.3322.net/lysoft/lyftp.exe
試一試,要是可以的,就說明我改寫成功了,那個東東5萬行程式碼的
--------------------------------------------------------------- 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
下面是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;網海無涯,學無止境! 發表人 - qoo1234 於 2004/02/09 12:04:58 |
Ktop_Robot
站務副站長 發表:0 回覆:3511 積分:0 註冊:2007-04-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |