2013-11-28 60 views
0

我正在使用libcurl將文件上傳到遠程ftp服務器。我想確保服務器已準備好開始接收上傳文件,然後才能真正開始發送它們(我無法上傳文件進行測試,必須事先知道ftp服務器是否準備就緒)。理想情況下,我想編寫一個代碼,它將登錄到ftp服務器並將目錄切換到遠程服務器上的目標目錄。如果測試通過,我可以假定服務器已準備好接收文件。我寫了下面的代碼使用libcurl檢查FTP登錄

curl_global_init(CURL_GLOBAL_ALL); 
m_curl = curl_easy_init(); // Get a curl handle 
if (!m_curl) 
    return -1; 
curl_easy_setopt(m_curl, CURLOPT_USERNAME, "username"); 
curl_easy_setopt(m_curl, CURLOPT_PASSWORD, "password"); 
curl_easy_setopt(m_curl, CURLOPT_UPLOAD, 1L); 
struct curl_slist* headerList = NULL; 
headerList = curl_slist_append(headerList, "CWD directory"); 
curl_easy_setopt(m_curl, CURLOPT_URL, "ftp://192.168.1.2/"); 
curl_easy_setopt(m_curl, CURLOPT_POSTQUOTE, headerList); 
CURLcode res = curl_easy_perform(m_curl); 
if(res == CURLE_OK) 
    return 0; 
else 
    return -1; 

的用戶名和密碼是否正確,並在FTP根目錄下存在。我看網絡捕獲,似乎在成功登錄後,我的客戶端請求「PWD」,它傳遞正常,但它要求目錄的大小,但它得到550錯誤,無法獲得文件大小。然後,我嘗試了沒有headerList,只是登錄,再次登錄通過罰款和PWD請求後,我得到500 OOPS,vsf_sysutil_recv_peek沒有數據。任何想法如何以類似的方式測試服務器?

回答

1

首先,不要在QUOTE選項中使用「CWD」 - 這是沒有必要的。直接在URL中提供完整路徑。

然後,您要求上傳,但您沒有指定要上傳的內容。我建議你通過做一個「虛擬請求」,例如列出目錄內容(如果你使用尾部斜線結束URL,它會這樣做)「準備」,並且...

然後你保留然後處理,然後在第二個請求中設置上傳的選項,然後它將重新使用連接並登錄,因此不會有第二個連接過程。

+0

我開始使用完整的URL和沒有CWD,但我得到了500 OOPS,vsf_sysutil_recv_peek沒有數據,所以我想我沒有正確使用libcurl。首先我感謝你的回答,我所做的只是添加最後的斜線,就是這樣。一般來說,我不認爲URL中的尾部斜線是代碼成功或失敗的關鍵,大多數規範化的URL都沒有結尾斜線,也許考慮支持URL而不使用斜線。 – e271p314

+0

libcurl支持的URL很好,沒有斜線。但無論如何,這是無關緊要的話題。 –