libCurl FTP 认证数据包未发送
libCurl FTP authentication packets not sending
我正在尝试连接到 ftp 服务器(使用域名)、登录,然后将文件上传到该服务器(这是我的服务器)。这是我正在使用的代码(基于 libcurl 网站上的示例)。
#include <iostream>
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
#define LOCAL_FILE "//home//uploadThis"
#define UPLOAD_FILE_AS "uploading-as"
#define RENAME_FILE_TO "uploadedFile" UPLOAD_FILE_AS
#define REMOTE_URL "myftpserver"
static size_t read_callback(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
curl_off_t nread;
size_t retcode = fread(ptr, size, nmemb, stream);
nread = (curl_off_t)retcode;
return retcode;
}
int main(int argv, char *argc[])
{
CURL *curl;
CURLcode res;
FILE *hd_src;
struct stat file_info;
curl_off_t fsize;
struct curl_slist *headerlist=NULL;
static const char buf1[] = "RNFR " UPLOAD_FILE_AS;
static const char buf2[] = "RNTO " RENAME_FILE_TO;
fsize = (curl_off_t)file_info.st_size;
hd_src = fopen(LOCAL_FILE, "rb");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
{
headerlist = curl_slist_append(headerlist, buf1);
headerlist = curl_slist_append(headerlist, buf2);
const char *userpass = "username:password";
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl, CURLOPT_URL, REMOTE_URL);
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
curl_easy_setopt(curl, CURLOPT_PORT, 21);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_USERPWD, userpass);
res = curl_easy_perform(curl);
curl_slist_free_all(headerlist);
curl_easy_cleanup(curl);
}
fclose(hd_src);
curl_global_cleanup();
return 0;
}
我的问题是,一旦我 运行 程序,我就连接到 ftp(我看到了欢迎横幅),然后我得到了 5 "530 Please login with用户和密码。”消息,然后它们不断堆积。我完全不解,我已经尝试了每一种可能的身份验证方式(包括 url 中的凭据,使用以前版本中已弃用的功能等),但都无济于事。我很好奇,打开了 wireshark。从我的计算机发送的唯一请求是 PUT 命令,并且根本没有任何登录操作。有任何想法吗?感谢您的帮助。
您的 URL 没有指定协议。它需要以 FTP:// 开头才能成为 FTP 服务器。
如果没有指定的协议,libcurl 会根据名称进行猜测,然后它通常会选择 HTTP - 在您的情况下它似乎已经这样做了。
还有一个一般提示:启用 CURLOPT_VERBOSE 以查看完整的协议对话。它可以帮助您更快地检测和修复问题。
我正在尝试连接到 ftp 服务器(使用域名)、登录,然后将文件上传到该服务器(这是我的服务器)。这是我正在使用的代码(基于 libcurl 网站上的示例)。
#include <iostream>
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
#define LOCAL_FILE "//home//uploadThis"
#define UPLOAD_FILE_AS "uploading-as"
#define RENAME_FILE_TO "uploadedFile" UPLOAD_FILE_AS
#define REMOTE_URL "myftpserver"
static size_t read_callback(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
curl_off_t nread;
size_t retcode = fread(ptr, size, nmemb, stream);
nread = (curl_off_t)retcode;
return retcode;
}
int main(int argv, char *argc[])
{
CURL *curl;
CURLcode res;
FILE *hd_src;
struct stat file_info;
curl_off_t fsize;
struct curl_slist *headerlist=NULL;
static const char buf1[] = "RNFR " UPLOAD_FILE_AS;
static const char buf2[] = "RNTO " RENAME_FILE_TO;
fsize = (curl_off_t)file_info.st_size;
hd_src = fopen(LOCAL_FILE, "rb");
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if (curl)
{
headerlist = curl_slist_append(headerlist, buf1);
headerlist = curl_slist_append(headerlist, buf2);
const char *userpass = "username:password";
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
curl_easy_setopt(curl, CURLOPT_URL, REMOTE_URL);
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
curl_easy_setopt(curl, CURLOPT_PORT, 21);
curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
curl_easy_setopt(curl, CURLOPT_USERPWD, userpass);
res = curl_easy_perform(curl);
curl_slist_free_all(headerlist);
curl_easy_cleanup(curl);
}
fclose(hd_src);
curl_global_cleanup();
return 0;
}
我的问题是,一旦我 运行 程序,我就连接到 ftp(我看到了欢迎横幅),然后我得到了 5 "530 Please login with用户和密码。”消息,然后它们不断堆积。我完全不解,我已经尝试了每一种可能的身份验证方式(包括 url 中的凭据,使用以前版本中已弃用的功能等),但都无济于事。我很好奇,打开了 wireshark。从我的计算机发送的唯一请求是 PUT 命令,并且根本没有任何登录操作。有任何想法吗?感谢您的帮助。
您的 URL 没有指定协议。它需要以 FTP:// 开头才能成为 FTP 服务器。
如果没有指定的协议,libcurl 会根据名称进行猜测,然后它通常会选择 HTTP - 在您的情况下它似乎已经这样做了。
还有一个一般提示:启用 CURLOPT_VERBOSE 以查看完整的协议对话。它可以帮助您更快地检测和修复问题。