【问题标题】:libCurl FTP authentication packets not sendinglibCurl FTP身份验证数据包未发送
【发布时间】:2015-04-28 05:26:32
【问题描述】:

我正在尝试连接到 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 请使用 USER 和 PASS 登录”。消息,然后它们不断堆积。我完全感到困惑,并且尝试了所有可能的身份验证方式(包括 url 中的凭据,使用以前版本中已弃用的功能等),但无济于事。我很好奇,打开了wireshark。从我的计算机发送的唯一请求是 PUT 命令,根本没有登录内容。有任何想法吗?感谢您的帮助。

【问题讨论】:

    标签: c++ ftp libcurl


    【解决方案1】:

    您的网址未指定协议。它需要以 FTP:// 开头才能成为 FTP 服务器。

    如果没有指定的协议,libcurl guesses 基于名称,然后它主要会选择 HTTP - 在你的情况下它似乎已经完成了。

    也作为一般提示:启用CURLOPT_VERBOSE 以查看完整的协议对话。它可以帮助您更快地检测和解决问题。

    【讨论】:

    • 我试过了,然后再次检查了wireshark。通过添加 ftp://,我能够发送登录数据包。但是,在程序中,光标只是闪烁几秒钟,然后程序结束。我在想这可能是上传功能的问题?不确定,但感谢您一直以来的帮助
    • 然后启用 CURLOPT_VERBOSE 并检查命令和响应以确定发生了什么。
    • 哇...该选项非常有用,我能够弄清楚所有问题,因为我实际上可以看到发生了什么...谢谢。你应该在你的答案中包含这个问题,以供将来查看此问题的人使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多