Libcurl在内容POST上很少崩溃

我使用libCURL库将HTTP POST命令发送到外部设备。 我有两个基本命令。 第一个告诉设备擦除设备上的当前内容,第二个发送新内容。 我使用两个相同的POST头结构/地址,唯一的区别是在“发送内容”命令期间数据的附件。 两个命令都可以正确执行:第一个擦除数据,第二个擦除数据。 然而,该程序很少(约30%的时间)在“发送内容”命令之后崩溃。 没有错误给出。 正如我之前所说,数据发送之前它不会崩溃,并且它不会一直发生,这使得它特别令人发狂。

代码附在下面。 发送程序需要从“curl_easy_perform(curl)”操作中完全退出的内容后,是否有某些内容丢失? 我对这种类型的东西仍然相当缺乏经验,并且欢迎您提供任何建议。

int fnSendContent(BMP* pbmpContent)
{
    using namespace std;
    int Error = 0;

    CURL* curl;
    CURLcode res;
    struct curl_slist *headerlist=NULL;
    static const char buf[] = "aaaaaaaaa";
    CString str;
    string sURL;
    long lTimeout = 10;

    //Pass image into char array so that it can be sent to VIP
    ifstream fsContent;
    fsContent.open("MyImage.bmp",ios_base::binary);

    fsContent.seekg(0,ios::end);
    long lBMP_size = fsContent.tellg();
    fsContent.seekg(0,ios::beg);

    char* pcContent = new char[lBMP_size];
    for (int i = 0; i < lBMP_size; i++)
        pcContent[i] = 'F';
    bool bit = fsContent.eof();

    fsContent.read(pcContent,lBMP_size);
    fsContent.close();

    string Content_Length = "Content-Length: " + to_string((long long)lBMP_size);
    curl_global_init(CURL_GLOBAL_ALL);

    curl = curl_easy_init();

    //Build header
    headerlist = curl_slist_append(headerlist, buf);
    headerlist = curl_slist_append(headerlist, "Authorization: MyAuth);
    headerlist = curl_slist_append(headerlist, "Accept: MyAccept");
    headerlist = curl_slist_append(headerlist, "Content-Type: image/bmp");
    headerlist = curl_slist_append(headerlist, "Connection: keep-alive");
    headerlist = curl_slist_append(headerlist, Content_Length.c_str());
    headerlist = curl_slist_append(headerlist, "Expect: "); //Supress "Expect:" heading

    //Set URL to receive POST
    curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
    curl_easy_setopt(curl,CURLOPT_POST, true);
    curl_easy_setopt(curl, CURLOPT_HEADER, true);
    curl_easy_setopt(curl,CURLOPT_TIMEOUT, lTimeout);
    curl_easy_setopt(curl, CURLOPT_URL, "http://URL:Port/Command");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, lBMP_size);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, pcContent);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);

    //Send
    res = curl_easy_perform(curl); //Crash occurs on send
    CString str2(curl_easy_strerror(res));//Get Error Explanation

    if(res != CURLE_OK)
    {
        str2.Format(_T("curl_easy_perform() failed: %s [%d]"), str2,res);
        DebugOut->AddString(str2);
        Error = E_SHOW_IMG;
    }

    curl_easy_cleanup(curl);
    curl_global_cleanup();
    curl_slist_free_all(headerlist);

    delete[] pcContent;

    return Error;
}

编辑:Daniel请求更多信息:

在我通过“curl_easy_perform(curl)”发送标题和数据之后,但在成功返回程序的其余部分之前发生崩溃。 我在VC ++中编码,只接收通用的“发生错误”。 数据收到后发生错误的事实让我觉得我并没有正确地终止命令。 下面给出一个崩溃POST命令的WireShark打印输出。

    Source     Destination  Protocol  Length       Info
  ------------------------------------------------------------
  |MySourceIP  | MyDestIP |   HTTP  | 16438  |  POST /Command|
  ------------------------------------------------------------

POST /Command HTTP/1.1..Host: URL:Port..Authorization: My Auth..Content-Type:
image/bmp..Accept: MyAccept..Connection: keep-alive..Content-Length: 61
494....BM6.......6...(..........

[Followed by 61,494 bytes of data ending in null]

CURLOPT_POSTFIELDSIZE_LARGE选项采用'curl_off_t'参数,但您传入'long'。

链接地址: http://www.djcxy.com/p/48891.html

上一篇: Libcurl infrequently crashes on content POST

下一篇: Escaping CURL @ symbol with PHP