2017-08-13 445 views
0

我有一個應用程序使用LibCurl來上傳文件。我使用下面的功能顯示上傳進度,效果很好。但是,我無法獲得curl_easy_getinfo函數的平均上傳速度(CURLINFO_SPEED_UPLOAD)或時間(CURLINFO_TOTAL_TIME)。我在這裏做錯了什麼?我看不出Libcurl的原始示例有多大差異?C++ Libcurl curl_easy_getinfo在CURLOPT_XFERINFOFUNCTION-函數中不返回任何內容

static int ReceiveFileProgress(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) { 
    if (ultotal > 0) { 
     string Output; 
     double curtime = 0; 
     char ulspeed[10000]; 
     double ulspeed_curl = 0; 
     double ulnow_db = (double)ulnow; 
     double ultotal_db = (double)ultotal; 
     double percentage = ceil((ulnow_db/ultotal_db) * 100); 
     struct myprogress *myp = (struct myprogress *)p; 
     CURL *curl = myp->curl; 
     if (curl) { 
      cout << "CURL OK" << endl; 
      } 
     else { 
      cout << "CURL FAILED" << endl; 
      } 
     if (percentage != 100) { 
      curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &ulspeed_curl); 
      } 
     curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &curtime); 
     readable_fs(ulspeed_curl, ulspeed); 
     stringstream OutputStream; 
     OutputStream << percentage; 
     Output = PadString(OutputStream.str(), 3, " "); 
     OutputStream.str(""); 
     OutputStream << Output << "%"; 
     if (percentage != 100) { 
      OutputStream << " (" << ulspeed << "/s)"; 
      } 
     Output = OutputStream.str(); 
     if (Output.length() > SendOffFileMaxProgressLength) { 
      Output.substr(0, SendOffFileMaxProgressLength - 3); 
      Output += "..."; 
      } 
     else { 
      while (Output.length() < SendOffFileMaxProgressLength) { 
       Output += ' '; 
       } 
      } 
     cout << Output << '\r'; 
     } 
    return 0; 
    } 

的捲曲請求:

string PerformCurlRequest(string RequestType, struct curl_httppost &formpost, struct curl_httppost &lastptr) { 
    CURL *curl; 
    CURLcode res; 
    bool UsedProxy; 
    string CurlResponse; 
    int LibCurlError = 0; 
    int ProxyRetryCount = 1; 
    bool TryWithProxy = true; 
    struct curl_slist *LibcurlHeaders = NULL; 
    curl = curl_easy_init(); 
    if (curl) { 
     host = "url/"; 
     host += RequestType; 
     host += "/"; 
     LibcurlHeaders = curl_slist_append(LibcurlHeaders, "Expect:"); 
     curl_easy_setopt(curl, CURLOPT_URL, (host).c_str()); 
     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1); 
     curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1); 
     curl_easy_setopt(curl, CURLOPT_HTTPHEADER, LibcurlHeaders); 
     curl_easy_setopt(curl, CURLOPT_VERBOSE, CurlVerbose); 
     curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, LibcurlResponse); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, &CurlResponse); 
     curl_easy_setopt(curl, CURLOPT_DEBUGFUNCTION, GetCurlVerboseData); 
     curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, ReceiveFileProgress); 
     curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &progress); 
     curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false); 
     res = curl_easy_perform(curl); 
     curl_slist_free_all(LibcurlHeaders); 
     curl_easy_cleanup(curl); 
     } 
    return CurlResponse; 
    } 

發送關閉文件:

PerformCurlRequest("SendFile", *formpostReceiveFile, *lastptrReceiveFile) 

回答

1

我不知道你使用的是什麼版本的libcurl或者您可能搞砸你的代碼某處否則,但我確實可以在此示例代碼中執行HTTP「上傳」(在此使用PUT以簡化操作)從libcurl進度回調中製作CURLINFO_SPEED_UPLOAD

#include <stdio.h> 
#include <curl/curl.h> 
#include <sys/stat.h> 

struct myprogress { 
    CURL *curl; 
}; 

static int xferinfo(void *p, curl_off_t dltotal, curl_off_t dlnow, 
        curl_off_t ultotal, curl_off_t ulnow) 
{ 
    struct myprogress *myp = (struct myprogress *)p; 
    CURL *curl = myp->curl; 
    double ulspeed_curl = 0; 

    curl_easy_getinfo(curl, CURLINFO_SPEED_UPLOAD, &ulspeed_curl); 

    fprintf(stderr, "UP: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T 
      " DOWN: %" CURL_FORMAT_CURL_OFF_T " of %" CURL_FORMAT_CURL_OFF_T 
      " AVRUP: %.1f" 
      "\r\n", 
      ulnow, ultotal, dlnow, dltotal, ulspeed_curl); 

    return 0; 
} 

/* send off a random test file lying around */ 
#define FILENAME "file-to-send" 

int main(void) 
{ 
    CURL *curl; 
    CURLcode res = CURLE_OK; 
    struct myprogress prog; 

    curl = curl_easy_init(); 
    if(curl) { 
    FILE *strace; 
    struct stat file_info; 
    prog.curl = curl; 

    strace = fopen(FILENAME, "rb"); 
    if(!strace) 
     return 1; 

    /* get the file size of the local file */ 
    stat(FILENAME, &file_info); 

    curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/"); 
    curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo); 
    curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog); 
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L); 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); 
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, 
        (curl_off_t)file_info.st_size); 
    curl_easy_setopt(curl, CURLOPT_READDATA, strace); 
    res = curl_easy_perform(curl); 

    if(res != CURLE_OK) 
     fprintf(stderr, "%s\n", curl_easy_strerror(res)); 

    /* always cleanup */ 
    curl_easy_cleanup(curl); 
    } 
    return (int)res; 
} 
+0

感謝您的回覆。我用curl請求更新了這個問題。也許你可以發現一些東西?我不知道這裏有什麼可能是錯誤的... –

+0

我也用過你的進度函數,但它也返回了我的平均速度(包括向下和向上)0 –

+0

我在進程中添加了一小段代碼函數不斷返回'CURL FAILED',如問題 –