繁体   English   中英

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

[英]Why is libcurl sending packets between localhost ports?

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

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

造成这种流量的原因可能是什么,我怎样才能让它 go 消失?

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 正在捕获的示例。 RawCap.exe 的输出

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM