为什么libcurl在本地主机端口之间发送数据包?

时间:2020-07-28 14:25:19

标签: c++ libcurl

我已经开始使用libcurl,只是尝试运行基本代码以从url获取文件。当我使用使用相同库编译的curl.exe获取此文件时,在本地主机上没有检测到任何随机流量。但是,当我使用自己的可执行文件运行时,我在两个localhost端口之间发送了大约19个数据包。

我确保在方法调用之后调用curl_global_init(CURL_GLOBAL_WIN32)和curl_global_cleanup()。

这种流量可能是什么原因,如何消除这种流量?

int CurlFileDownloader::downloadSingleFile(const std::string& url, const std::string& destination) {
    CURLcode res = CURLE_READ_ERROR;
        
    mHandle = curl_easy_init();
    if(mHandle) {
        mData.destinationFolder = destination;
        // Get the file name from the url
        auto lastPos = url.find_last_of("/");
        mData.fileName = url.substr(lastPos + 1);

        curl_easy_setopt(mHandle, CURLOPT_URL, url.c_str());
        /* Define our callback to get called when there's data to be written */ 
        curl_easy_setopt(mHandle, CURLOPT_WRITEFUNCTION, &CurlFileDownloader::writeFileContent);
        /* Set a pointer to our struct to pass to the callback */ 
        curl_easy_setopt(mHandle, CURLOPT_WRITEDATA, &mData);
    
        /* Switch on full protocol/debug output */ 
        curl_easy_setopt(mHandle, CURLOPT_VERBOSE, 1L);
    
        mLastError = curl_easy_perform(mHandle);
    
        /* always cleanup */ 
        curl_easy_cleanup(mHandle);
        if (mData.fileStream.is_open()) {
            mData.fileStream.close();
        }

        if(CURLE_OK != mLastError) {
            std::cerr << "Curl error " << mLastError << std::endl;
        }
    }

    return mLastError;
}
size_t CurlFileDownloader::writeFileContent(char *buffer, size_t size, size_t nmemb, void *cb_data) {
    struct CurlCallbackData *data = (CurlCallbackData*)cb_data;
    size_t written = 0;
    if (data->fileStream.is_open()) {
        data->fileStream.write(buffer, nmemb);
    }
    else {
        /* listing output */
        if (data->destinationFolder != "") {
            data->fileStream.open(data->destinationFolder + "\\" + data->fileName, std::ios::out | std::ios::binary);
        }
        else {
            data->fileStream.open(data->fileName, std::ios::out | std::ios::binary);
        }
        data->fileStream.write(buffer, nmemb);
    } 
    return nmemb;
}

以下是RawCap.exe捕获的示例。 Output of RawCap.exe

1 个答案:

答案 0 :(得分:1)

本地主机通信的来源是对IPV4环回使用套接字对。当从libCURL的socketpair.h中删除#USE_SOCKETPAIR时,问题就消失了。