2013-11-28 211 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很好,没有斜线。但无论如何,这是无关紧要的话题。 –