简体   繁体   中英

Why is libcurl sending packets between localhost ports?

I have started working with libcurl, and simply tried running the basic code to get a file from an url. When I get this file using curl.exe, compiled with the same library, I get detect no random traffic on my localhost. However, when I run with my own executable, I get around 19 packets sent between two localhost ports.

I make sure to call curl_global_init(CURL_GLOBAL_WIN32) and curl_global_cleanup() after the method call.

What could be the cause of this traffic, and how could I make it go away?

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;
}

Here is a sample of what RawCap.exe is capturing. RawCap.exe 的输出

The source of the localhost communication was the use of a socket pair for IPV4 Loopback. When removing the #USE_SOCKETPAIR from libCURL's socketpair.h, the issue went away.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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