1. 程式人生 > >使用MFC的FTP時每次上傳一個檔案後就出錯解決辦法

使用MFC的FTP時每次上傳一個檔案後就出錯解決辦法

用MFC的庫寫了個ftp上傳功能,先建立資料夾再上傳檔案,結果發現資料夾可以正常建立好,結果上傳檔案的時候每次只能傳一個檔案,之後程式就產生錯誤中斷。

可以確定的是本地通過其他ftp軟體訪問ftp伺服器是沒問題的,許可權也沒問題,可以建立檔案。

反覆的測試,結果都是隻能上傳一個檔案,於是懷疑是哪裡設定不對,先通過GetLastError獲得錯誤程式碼是12003,接著用InternetGetLastResponseInfo獲取詳細的錯誤資訊:227 Entering Passive Mode (xxx,xxx,,xxx,xxx,x)。。

網上查得:

 主動 FTP :

    命令連線:客戶端 >1024 埠 → 伺服器 21 埠
    資料連線:客戶端 >1024 埠 ← 伺服器 20 埠
 
被動 FTP :
    命令連線:客戶端 >1024 埠 → 伺服器 21 埠
    資料連線:客戶端 >1024 埠 ← 伺服器 >1024 埠
 
  PORT(主動)方式的連線過程是:客戶端向伺服器的FTP埠(預設是21)傳送連線請求,伺服器接受連線,建立一條命令鏈路。當需要傳送資料時, 客戶端在命令鏈路上用PORT命令告訴伺服器:“我打開了***X埠,你過來連線我”。於是伺服器從20埠向客戶端的***X埠傳送連線請求,建立一條資料鏈路來傳送資料。   
 
  PASV(被動)方式的連線過程是:客戶端向伺服器的FTP埠(預設是21)傳送連線請求,伺服器接受連線,建立一條命令鏈路。當需要傳送資料時, 伺服器在命令鏈路上用PASV命令告訴客戶端:“我打開了***X埠,你過來連線我”。於是客戶端向伺服器的***X埠傳送連線請求,建立一條資料鏈 路來傳送資料。 
 由於我的本地FTP伺服器在內網,只是從外網映射了兩個埠(20,21),所以無法使用PASV方式。


看來我用的那臺ftp伺服器也是不能用pasv方式,至於具體原因先不管了。查檢視怎麼只使用port方式。

CFtpConnection* GetFtpConnection(LPCTSTR pstrServer,
   LPCTSTR pstrUserName = NULL,
 LPCTSTR pstrPassword = NULL,
 INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
 BOOL bPassive = FALSE)
throw(CInternetException);
返回值:
指向CFtpConnection物件的指標。如果呼叫失敗,可通過檢查產生的CInternetException物件來確定出錯型別。
引數:
pstrServer指向包含FTP伺服器的字串的指標。
pstrUserName指向確定記入日誌的使用者名稱的空終止字串的指標。如果為NULL,預設為匿名。
pstrPassword指向確定用於登入的口令的空終止字串的指標。如果pstrPassword和pstrUserName都為NULL,預設匿名口令為使用者email名字。如果pstrPassword為NULL(或空字串)而pstrUserName不為NULL,可用空白口令。下列表格描述pstrUserName和pstrPassword四個可能設定的行為: pstrUserNamepstrPassword傳送到FTP伺服器的使用者名稱傳送到FTP伺服器的口令 NULL或" "NULL或" ""anonymous"使用者的e-mail名字 非NULL字串NULL或" "pstrUserName"" NULL非NULL字串ERRORERROR 非NULL字串非NULL字串pstrUserNamepstrPassword 
nPort一個表示伺服器上使用的TCP/IP埠的數字。
bPassive指定此FTP會話的被動或主動模式。如果設定為TRUE,它將Win32API dwFlag設定為INTERNET_FLAG_PASSIVE。


最後一個引數 bPassive的設為false便可以取消掉被動方式,修改之後獲取的CFtpConnection物件使用的就是主動方式, 測試問題解決!

ps:發現mfc的ftp真的好難寫啊,網上例子太少,唉。