【问题标题】:C++ Curl post request not working and no errorC++ Curl 发布请求不起作用且没有错误
【发布时间】:2020-07-06 12:25:41
【问题描述】:

我正在尝试做一个简单的命令行程序来向同一网络上的另一台计算机发出发布请求。在这台计算机上,我将使用 Hercules 阅读消息,稍后我将考虑如何从 c++ 代码中读取它。我正在使用带有 mingw x64 的 QtCreator。

当我运行小项目 Qt 打开控制台时,我立即看到控制台显示“按回车键关闭窗口”。代码有什么问题?

#include <iostream>
#include <curl/curl.h>
#include <string>
#include <cstdio>
#include <cstring>
#include <functional>

using namespace std;


class ScopeExit {
public:
    ScopeExit(std::function<void()> f): f_(f) {}
    ~ScopeExit() { f_(); }
private:
    std::function<void()> f_;
};

struct PostData
{
    const char *ptr;
    size_t size;
};

size_t read_data(void* ptr, size_t size, size_t nmemb, void *userp)
{
    PostData *post_data = (PostData*)userp;

    size_t byte_len = size * nmemb;
    if(post_data->size < byte_len)
    {
        byte_len = post_data->size;
    }

    memcpy(ptr, post_data->ptr, byte_len);
    post_data->ptr += byte_len;
    post_data->size -= byte_len;

    return byte_len;
}


static size_t WriteCallback(void *contents, size_t size, size_t nmeb, void *userp)
{
    ((std::string*)userp)->append((char*)contents, size * nmeb);
    return size * nmeb;
}

void post_request(std::string ipPort,std::string message)
{
    // EXCECUTION START HERE
    std::cout<<"Setting up request data!"<<std::endl;
    CURL *curl = curl_easy_init();
    if(!curl)
    {
        std::cout<<"curl_easy_init() failed"<<std::endl;
    }


    ScopeExit curl_close([&curl] {
        curl_easy_cleanup(curl);
    });



    curl_easy_setopt(curl, CURLOPT_URL, ipPort.c_str());
    // set http method to POST
    curl_easy_setopt(curl, CURLOPT_POST, 1L);


    const char *msg = message.c_str();
    PostData post_data;
    post_data.ptr = msg;
    post_data.size = strlen(msg);
    curl_easy_setopt(curl, CURLOPT_READDATA, &post_data);
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_data);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, strlen(msg));

    // set callback on receiving data
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, stdout);

    // execute
    CURLcode res = curl_easy_perform(curl);
    if(res != CURLE_OK)
    {
        std::cout<<"Error on curl_easy_perform: "<< curl_easy_strerror(res)<<std::endl;
    }
}

int main()
{
    std::string ipPort;
    std::string message;

    std::cout<<"Insert destination ip with port: ";
    std::cin>>ipPort;
    std::cout<<std::endl;


    std::cout<<"Insert messagge: ";
    std::cin>>message;
    std::cout<<std::endl;

    std::cout<<"Press p for doing a post request"<<std::endl;


    post_request("http://192.168.1.23:55231","hello");


    return 0;
}

谢谢!

【问题讨论】:

  • 您可能想阅读以下内容:How to create a minimal reproducible example
  • 您是否尝试在调试器中逐行运行代码,同时监控所有变量的值?第一个输出行std::cout&lt;&lt;"Insert destination ip with port: "; 是否曾经被执行过?
  • 一运行程序,我就会看到“按回车键关闭窗口”。我已经尝试过调试它,我总是看到按下回车键关闭窗口,它会跳转所有断点并结束,即使使用调试器也是如此。
  • 您的代码似乎永远不会被执行。因此,问题似乎是 Qt 如何调用您的程序。不幸的是,我无法帮助您,因为我没有使用 Qt 的经验。

标签: c++ curl post


【解决方案1】:

我解决了这个错误。我没有加载所需的 dll。

我将 libcurl、libcrypto 和 libssl dll 添加到调试/发布文件夹中,并且使用此 .pro 文件可以正常工作:

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += \
        main.cpp


INCLUDEPATH += path/to/curl/include

LIBS += -Lpath/to/curl/lib/folder -lcurl

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 2019-12-19
    • 2020-08-14
    • 2019-10-14
    • 1970-01-01
    • 2019-10-26
    • 2016-09-05
    • 2020-09-28
    相关资源
    最近更新 更多