आप C ++ के साथ HTTP अनुरोध कैसे करते हैं?


258

क्या सी ++ के साथ आसानी से HTTP अनुरोध करने का कोई तरीका है? विशेष रूप से, मैं एक पृष्ठ (एक एपीआई) की सामग्री को डाउनलोड करना चाहता हूं और यह देखने के लिए सामग्री की जांच कर सकता हूं कि क्या इसमें १ या ०.० है। क्या सामग्री को एक स्ट्रिंग में डाउनलोड करना भी संभव है?


1
नहीं, वर्तमान में नेटवर्किंग के लिए भाषा या मानक पुस्तकालय के माध्यम से कोई अंतर्निहित समर्थन नहीं है। हालाँकि, एक नेटवर्किंग TS N4370 है । पुस्तकालय की सिफारिशों को आकर्षित करने के बाद से मैंने इस प्रश्न को VTC भी किया।

BoostBeast के बारे में कैसे?
2

जवाबों:


249

मुझे भी यही समस्या थी। libcurl वास्तव में पूर्ण है। एक C ++ रैपर कर्लप है जो आपको C ++ लाइब्रेरी के लिए पूछने पर आपको रुचि दे सकता है। नियॉन एक और दिलचस्प सी लाइब्रेरी है जो WebDAV का भी समर्थन करता है

यदि आप C ++ का उपयोग करते हैं तो कर्लप स्वाभाविक लगता है। स्रोत वितरण में कई उदाहरण दिए गए हैं। URL की सामग्री प्राप्त करने के लिए आप ऐसा कुछ करते हैं (उदाहरणों से निकाला गया):

// Edit : rewritten for cURLpp 0.7.3
// Note : namespace changed, was cURLpp in 0.7.2 ...

#include <curlpp/cURLpp.hpp>
#include <curlpp/Options.hpp>

// RAII cleanup

curlpp::Cleanup myCleanup;

// Send request and get a result.
// Here I use a shortcut to get it in a string stream ...

std::ostringstream os;
os << curlpp::options::Url(std::string("http://www.wikipedia.org"));

string asAskedInQuestion = os.str();

examplesनिर्देशिका को कर्लअप स्रोत वितरण में देखें , बहुत अधिक जटिल मामले हैं, साथ ही कर्लप का उपयोग करते हुए एक सरल पूर्ण न्यूनतम है

मेरे 2 सेंट ...


1
नवीनतम संस्करण मैक के तहत टूट गया लगता है .. कुछ config.h के साथ गड़बड़ है जब पुस्तकालय के रूप में जुड़ा हुआ है।
यूजीन

1
खैर, मैं ऊपर संकलन नहीं कर सका। हालांकि, दिए गए परिणामों के os << myRequest.perform();साथ प्रतिस्थापित करना myRequest.setOpt( new curlpp::options::WriteStream( &os ) ); myRequest.perform();। उपयोग न करने के लिए सुनिश्चित करें http://example.com, यह एक खाली पृष्ठ लौटाएगा। बेहतर उपयोग जैसे http://www.wikipedia.org
ज़ेन

4
आप MSVS में कर्लप कैसे बनाते हैं? मैं इसे काम नहीं कर सकता :(
mr5

2
मैं @ ryan-sam द्वारा नवीनतम संपादन से सहमत नहीं हूं। यह स्पष्ट रूप से "वेबदाव" लिखने के लिए लेखक का उद्देश्य था न कि वेब विकास, क्योंकि दी गई लाइब्रेरी "HTTP और WebDAV संचालन" के लिए स्पष्ट रूप से बनाई गई है।
बॉस्सरोट

2
@bostrot: हाँ, जो मेरा मतलब था। मैंने पलट दिया और एक लिंक जोड़ा, मुझे लगता है कि लोगों ने सोचा कि मैंने वेबदेव लिखा है। क्या अफ़सोस :)
न्यूरो

115

विंडोज कोड:

#include <string.h>
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <vector>
#include <locale>
#include <sstream>
using namespace std;
#pragma comment(lib,"ws2_32.lib")




int main( void ){

WSADATA wsaData;
SOCKET Socket;
SOCKADDR_IN SockAddr;
int lineCount=0;
int rowCount=0;
struct hostent *host;
locale local;
char buffer[10000];
int i = 0 ;
int nDataLength;
string website_HTML;

// website url
string url = "www.google.com";

//HTTP GET
string get_http = "GET / HTTP/1.1\r\nHost: " + url + "\r\nConnection: close\r\n\r\n";


    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0){
        cout << "WSAStartup failed.\n";
        system("pause");
        //return 1;
    }

    Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    host = gethostbyname(url.c_str());

    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);

    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
        cout << "Could not connect";
        system("pause");
        //return 1;
    }

    // send GET / HTTP
    send(Socket,get_http.c_str(), strlen(get_http.c_str()),0 );

    // recieve html
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r'){

            website_HTML+=buffer[i];
            i += 1;
        }               
    }

    closesocket(Socket);
    WSACleanup();

    // Display HTML source 
    cout<<website_HTML;

    // pause
    cout<<"\n\nPress ANY key to close.\n\n";
    cin.ignore(); cin.get(); 


 return 0;
}

यहाँ एक बेहतर कार्यान्वयन है:

#include <windows.h>
#include <string>
#include <stdio.h>

using std::string;

#pragma comment(lib,"ws2_32.lib")


HINSTANCE hInst;
WSADATA wsaData;
void mParseUrl(char *mUrl, string &serverName, string &filepath, string &filename);
SOCKET connectToServer(char *szServerName, WORD portNum);
int getHeaderLength(char *content);
char *readUrl2(char *szUrl, long &bytesReturnedOut, char **headerOut);


int main()
{
    const int bufLen = 1024;
    char *szUrl = "http://stackoverflow.com";
    long fileSize;
    char *memBuffer, *headerBuffer;
    FILE *fp;

    memBuffer = headerBuffer = NULL;

    if ( WSAStartup(0x101, &wsaData) != 0)
        return -1;


    memBuffer = readUrl2(szUrl, fileSize, &headerBuffer);
    printf("returned from readUrl\n");
    printf("data returned:\n%s", memBuffer);
    if (fileSize != 0)
    {
        printf("Got some data\n");
        fp = fopen("downloaded.file", "wb");
        fwrite(memBuffer, 1, fileSize, fp);
        fclose(fp);
         delete(memBuffer);
        delete(headerBuffer);
    }

    WSACleanup();
    return 0;
}


void mParseUrl(char *mUrl, string &serverName, string &filepath, string &filename)
{
    string::size_type n;
    string url = mUrl;

    if (url.substr(0,7) == "http://")
        url.erase(0,7);

    if (url.substr(0,8) == "https://")
        url.erase(0,8);

    n = url.find('/');
    if (n != string::npos)
    {
        serverName = url.substr(0,n);
        filepath = url.substr(n);
        n = filepath.rfind('/');
        filename = filepath.substr(n+1);
    }

    else
    {
        serverName = url;
        filepath = "/";
        filename = "";
    }
}

SOCKET connectToServer(char *szServerName, WORD portNum)
{
    struct hostent *hp;
    unsigned int addr;
    struct sockaddr_in server;
    SOCKET conn;

    conn = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (conn == INVALID_SOCKET)
        return NULL;

    if(inet_addr(szServerName)==INADDR_NONE)
    {
        hp=gethostbyname(szServerName);
    }
    else
    {
        addr=inet_addr(szServerName);
        hp=gethostbyaddr((char*)&addr,sizeof(addr),AF_INET);
    }

    if(hp==NULL)
    {
        closesocket(conn);
        return NULL;
    }

    server.sin_addr.s_addr=*((unsigned long*)hp->h_addr);
    server.sin_family=AF_INET;
    server.sin_port=htons(portNum);
    if(connect(conn,(struct sockaddr*)&server,sizeof(server)))
    {
        closesocket(conn);
        return NULL;
    }
    return conn;
}

int getHeaderLength(char *content)
{
    const char *srchStr1 = "\r\n\r\n", *srchStr2 = "\n\r\n\r";
    char *findPos;
    int ofset = -1;

    findPos = strstr(content, srchStr1);
    if (findPos != NULL)
    {
        ofset = findPos - content;
        ofset += strlen(srchStr1);
    }

    else
    {
        findPos = strstr(content, srchStr2);
        if (findPos != NULL)
        {
            ofset = findPos - content;
            ofset += strlen(srchStr2);
        }
    }
    return ofset;
}

char *readUrl2(char *szUrl, long &bytesReturnedOut, char **headerOut)
{
    const int bufSize = 512;
    char readBuffer[bufSize], sendBuffer[bufSize], tmpBuffer[bufSize];
    char *tmpResult=NULL, *result;
    SOCKET conn;
    string server, filepath, filename;
    long totalBytesRead, thisReadSize, headerLen;

    mParseUrl(szUrl, server, filepath, filename);

    ///////////// step 1, connect //////////////////////
    conn = connectToServer((char*)server.c_str(), 80);

    ///////////// step 2, send GET request /////////////
    sprintf(tmpBuffer, "GET %s HTTP/1.0", filepath.c_str());
    strcpy(sendBuffer, tmpBuffer);
    strcat(sendBuffer, "\r\n");
    sprintf(tmpBuffer, "Host: %s", server.c_str());
    strcat(sendBuffer, tmpBuffer);
    strcat(sendBuffer, "\r\n");
    strcat(sendBuffer, "\r\n");
    send(conn, sendBuffer, strlen(sendBuffer), 0);

//    SetWindowText(edit3Hwnd, sendBuffer);
    printf("Buffer being sent:\n%s", sendBuffer);

    ///////////// step 3 - get received bytes ////////////////
    // Receive until the peer closes the connection
    totalBytesRead = 0;
    while(1)
    {
        memset(readBuffer, 0, bufSize);
        thisReadSize = recv (conn, readBuffer, bufSize, 0);

        if ( thisReadSize <= 0 )
            break;

        tmpResult = (char*)realloc(tmpResult, thisReadSize+totalBytesRead);

        memcpy(tmpResult+totalBytesRead, readBuffer, thisReadSize);
        totalBytesRead += thisReadSize;
    }

    headerLen = getHeaderLength(tmpResult);
    long contenLen = totalBytesRead-headerLen;
    result = new char[contenLen+1];
    memcpy(result, tmpResult+headerLen, contenLen);
    result[contenLen] = 0x0;
    char *myTmp;

    myTmp = new char[headerLen+1];
    strncpy(myTmp, tmpResult, headerLen);
    myTmp[headerLen] = NULL;
    delete(tmpResult);
    *headerOut = myTmp;

    bytesReturnedOut = contenLen;
    closesocket(conn);
    return(result);
}

देव-सी ++ संस्करण 4.9.9.2 के साथ संकलित एक विंडोज विस्टा पर इस कोड की कोशिश की। लिंक करते समय मैंने मुझे त्रुटियों का एक गुच्छा दिया: [लिंकर त्रुटि] `WSAStartup @ 8 'के लिए अपरिभाषित संदर्भ
विस्तार-देव

4
@ विस्तार-देव ओनली MSVC (विजुअल स्टूडियो) "प्रैग्मेंट कमेंट" को समझता है। यदि आप कुछ और उपयोग करते हैं, तो आपको "ws2_32.lib" को मैन्युअल रूप से (किसी भी अन्य पुस्तकालय की तरह) लिंक करना होगा।
नवीन

24
@JuanLuisSoldi मुझे लगता है कि आपको वास्तव में इस कोड की "सुंदरता" की सराहना करने के लिए एक विंडोज देव होने की आवश्यकता है ...
static_rtti

यहाँ (recv का उपयोग करके) क्या प्राप्त होना चाहिए? मुझे आउटपुट के रूप में बहुत सारी जिबरिश मिल रही है। इसके अलावा, आपने भेजे गए बफ़र (जैसे GET / HTTP/1.1.1/... etc) में क्या किया है? मुझे कैसे पता चलेगा कि मैं क्या भेजूं?
लेज़रशार्क्स

43

अद्यतन 2020: मेरे पास एक नया उत्तर है जो इसे प्रतिस्थापित करता है, अब 8-वर्षीय है, एक: https://stackoverflow.com/a/61177330/278976

लिनक्स पर, मैंने cpp-netlib, libcurl, curlpp, urdl, boost :: asio और Qt पर विचार किया (लेकिन लाइसेंस के आधार पर इसे ठुकरा दिया)। ये सभी या तो इस उपयोग के लिए अपूर्ण थे, मैला इंटरफेस था, खराब दस्तावेज़ीकरण था, बिना मान्यता प्राप्त थे या https का समर्थन नहीं किया था।

फिर, https://stackoverflow.com/a/1012577/278976 के सुझाव पर , मैंने POCO की कोशिश की। वाह, काश, मैंने यह सालों पहले देखा होता। यहाँ POCO के साथ HTTP GET अनुरोध करने का एक उदाहरण दिया गया है:

https://stackoverflow.com/a/26026828/2817595

POCO मुक्त, ओपन सोर्स (बूस्ट लाइसेंस) है। और नहीं, कंपनी के साथ मेरा कोई संबंध नहीं है; मुझे वास्तव में उनके इंटरफेस पसंद हैं। महान नौकरी लोग (और लड़कियों)।

https://pocoproject.org/download.html

आशा है कि यह किसी की मदद करता है ... इन सभी पुस्तकालयों को आजमाने में मुझे तीन दिन लगे।


1
यहाँ एक अतिरिक्त उदाहरण है: github.com/pocoproject/poco/blob/develop/Net/samples/httpget/…
Homer6

2
मैंने अभी आपके सुझाव पर पोको डाउनलोड किया है। मैं कुछ प्रकाश को पसंद करूंगा जो एसटीएल को बनाता है और इसे फिर से लिखने के बजाय बढ़ावा देता है। इसके अलावा, मैं CppUnit का प्रशंसक नहीं हूं और विशेष रूप से बिल्ड के साथ चल रहे नफरत परीक्षण में, और जैसा कि मैंने इसे बनाया है, उनके पुस्तकालय का परीक्षण करने की उम्मीद नहीं है।
कैशबैक

यह थोड़ा बड़ा है। हालाँकि, आप परीक्षण और नमूने (या साझा लाइब्रेरी) को कॉन्फ़िगर करने के साथ अक्षम कर सकते हैं (यानी। - परीक्षण-या -नमूने या यानो-शेर्लिब)। देखें github.com/pocoproject/poco/blob/develop/configure
होमर 6

उसके लिये आपका धन्यवाद। मैं इसे वैसे भी चाहता हूं जैसे मुझे उन कार्यों को करने की परवाह है जो मुझे करने की आवश्यकता है। और मैं ध्यान देता हूं कि उनके पास JSON भी है, जो कि अच्छा है क्योंकि मुझे यह करने की आवश्यकता है कि HTTP अनुरोध भेजने के बाद मुझे जो लाइब्रेरी के लिए मिला है।
कैशबैक

यह कुछ समय पहले था, लेकिन यह आपको यह बताने के लिए है कि आपके लिंक में से कोई भी अब काम नहीं कर रहा है, यहां तक ​​कि
गिथब

33

C ++ अनुरोध नामक एक नया, कम परिपक्व कर्ल आवरण विकसित किया जा रहा है । यहाँ एक सरल GET अनुरोध है:

#include <iostream>
#include <cpr.h>

int main(int argc, char** argv) {
    auto response = cpr::Get(cpr::Url{"http://httpbin.org/get"});
    std::cout << response.text << std::endl;
}

यह HTTP क्रिया और कर्ल विकल्पों की एक विस्तृत विविधता का समर्थन करता है। यहाँ अधिक उपयोग प्रलेखन है

अस्वीकरण: मैं इस पुस्तकालय का अनुचर हूं


10
मैं कल आपकी CppCon 2015 की लाइटनिंग वार्ता में था। अच्छी तरह से किया - बात और पुस्तकालय दोनों। मैं विशेष रूप से "लोगों के लिए कर्ल" डिजाइन दर्शन पसंद करता हूं।
U007D

नमस्कार, मैं अभी इस पोस्ट पर आया हूँ, सादे तरीके से आसान C ++ HTTP अनुरोधों की तलाश में। हालाँकि, मैं वास्तव में पुस्तकालयों के साथ अनुभवी नहीं हूं, और मुझे वास्तव में यह पता नहीं है कि इसे मेरे दृश्य स्टूडियो सी ++ प्रोजेक्ट में कैसे शामिल किया जाए। कहीं कोई स्पष्टीकरण नहीं है? मुझे ऐसा लगता है कि यह पुस्तकालय के लिए विशिष्ट नहीं है, बल्कि यह है कि मुझे वास्तव में नहीं पता कि मेरे सामने अब मेरे पास क्या है।
सोसेंबिंदर

2
@Sossenbinder, यदि आप सीएमके से खुद को परिचित कर सकते हैं, तो आप इस प्रोजेक्ट के लिए विजुअल स्टूडियो बिल्ड फाइल्स जेनरेट कर सकते हैं। Appveyor विन्यास फ़ाइल यह कैसे पूरा करने के लिए का एक मोटा उदाहरण में शामिल है।
हू

2
अच्छा लग रहा है, लेकिन इमारत नरक है, इसलिए आपका दायित्व बेकार है, मैं पैकेज मैनेजर पर भरोसा नहीं कर सकता (बाहरी तरीके से डिप्स जोड़ने के लिए विश्वसनीय तरीके की आवश्यकता है) और जितनी जल्दी हो सके कार्यात्मक lib की आवश्यकता है ...
dev1223

ऐसे आप इसको करते हैं। जब आप दूसरे सबसे अधिक
उत्तोलित

17

यहाँ एक स्ट्रिंग के रूप में एक वेबपेज लाने में सक्षम होने के लिए cURL के आसपास मेरा न्यूनतम आवरण है। यह उपयोगी है, उदाहरण के लिए, यूनिट परीक्षण के लिए। यह मूल रूप से C कोड के आसपास RAII रैपर है।

अपनी मशीन yum install libcurl libcurl-develया समकक्ष पर "libcurl" स्थापित करें ।

उपयोग उदाहरण:

CURLplusplus client;
string x = client.Get("http://google.com");
string y = client.Get("http://yahoo.com");

कक्षा कार्यान्वयन:

#include <curl/curl.h>


class CURLplusplus
{
private:
    CURL* curl;
    stringstream ss;
    long http_code;
public:
    CURLplusplus()
            : curl(curl_easy_init())
    , http_code(0)
    {

    }
    ~CURLplusplus()
    {
        if (curl) curl_easy_cleanup(curl);
    }
    std::string Get(const std::string& url)
    {
        CURLcode res;
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, this);

        ss.str("");
        http_code = 0;
        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            throw std::runtime_error(curl_easy_strerror(res));
        }
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
        return ss.str();
    }
    long GetHttpCode()
    {
        return http_code;
    }
private:
    static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
    {
        return static_cast<CURLplusplus*>(userp)->Write(buffer,size,nmemb);
    }
    size_t Write(void *buffer, size_t size, size_t nmemb)
    {
        ss.write((const char*)buffer,size*nmemb);
        return size*nmemb;
    }
};

16

libCURL आपके लिए एक बहुत अच्छा विकल्प है। आपको क्या करने की आवश्यकता है, इसके आधार पर, ट्यूटोरियल को आपको यह बताना चाहिए कि आप क्या चाहते हैं, विशेष रूप से आसान हैंडल के लिए। लेकिन, मूल रूप से, आप ऐसा सिर्फ एक पृष्ठ के स्रोत को देखने के लिए कर सकते हैं:

CURL* c;
c = curl_easy_init();
curl_easy_setopt( c, CURL_URL, "www.google.com" );
curl_easy_perform( c );
curl_easy_cleanup( c );

मेरा मानना ​​है कि यह परिणाम को स्टडआउट करने के लिए मुद्रित किया जाएगा। यदि आप इसके बजाय इसे संभालना चाहते हैं - जो, मुझे लगता है, आप करते हैं - आपको CURL_WRITEFUNCTION सेट करना होगा। यह सब ऊपर दिए गए कर्ल ट्यूटोरियल में शामिल है।


16

जैसा कि आप C ++ समाधान चाहते हैं, आप Qt का उपयोग कर सकते हैं । यह एक QHttp वर्ग है जिसका आप उपयोग कर सकते हैं।

आप डॉक्स की जांच कर सकते हैं :

http->setHost("qt.nokia.com");
http->get(QUrl::toPercentEncoding("/index.html"));

Qt में इसके अलावा भी बहुत कुछ है जो आप एक सामान्य C ++ ऐप में उपयोग कर सकते हैं।


4
मुझे लगता है कि QHttp को QNetworkAccessManager और संबंधित कक्षाओं के साथ Qt 4.6 और बाद के संस्करणों में बदल दिया गया है।
जजलिन

3
QNetworkAccessManagerक्यूटी 4.4 के बाद से प्रलेखित किया गया है; और Qt 4.8 में कहा गया है: QHttp - This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.इसलिए मुझे लगता है कि यह अभी भी उपलब्ध है, यदि आप पदावनत चेतावनी को अनदेखा करते हैं।
जेसी चिशोल्म

13

आप C ++ REST SDK (कोडनेम "कैसाब्लांका") चेक करना चाह सकते हैं । http://msdn.microsoft.com/en-us/library/jj950081.aspx

C ++ REST SDK के साथ, आप अपने C ++ ऐप से HTTP सर्वर से आसानी से जुड़ सकते हैं।

उपयोग उदाहरण:

#include <iostream>
#include <cpprest/http_client.h>

using namespace web::http;                  // Common HTTP functionality
using namespace web::http::client;          // HTTP client features

int main(int argc, char** argv) {
    http_client client("http://httpbin.org/");

    http_response response;
    // ordinary `get` request
    response = client.request(methods::GET, "/get").get();
    std::cout << response.extract_string().get() << "\n";

    // working with json
    response = client.request(methods::GET, "/get").get();
    std::cout << "url: " << response.extract_json().get()[U("url")] << "\n";
}

C ++ REST SDK एक आधुनिक अतुल्यकालिक C + API डिज़ाइन का उपयोग करके मूल कोड में क्लाउड-आधारित क्लाइंट-सर्वर संचार के लिए एक Microsoft प्रोजेक्ट है।


10

इस उत्तर के साथ मैं Software_Developer से उत्तर का उल्लेख करता हूं । कोड के पुनर्निर्माण करके मैंने पाया कि कुछ भागों रहे हैं पदावनत ( gethostbyname()) या त्रुटि से निपटने प्रदान नहीं करते हैं (, सॉकेट के निर्माण के कुछ भेजने) एक ऑपरेशन के लिए।

निम्न विंडोज़ कोड को विज़ुअल स्टूडियो 2013 और विंडोज 8.1 64-बिट के साथ-साथ विंडोज 7 64-बिट के साथ परीक्षण किया गया है। यह www.google.com के वेब सर्वर के साथ IPv4 TCP कनेक्शन को लक्षित करेगा।

#include <winsock2.h>
#include <WS2tcpip.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
    int main (){
    // Initialize Dependencies to the Windows Socket.
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
        return -1;
    }

    // We first prepare some "hints" for the "getaddrinfo" function
    // to tell it, that we are looking for a IPv4 TCP Connection.
    struct addrinfo hints;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;          // We are targeting IPv4
    hints.ai_protocol = IPPROTO_TCP;    // We are targeting TCP
    hints.ai_socktype = SOCK_STREAM;    // We are targeting TCP so its SOCK_STREAM

    // Aquiring of the IPv4 address of a host using the newer
    // "getaddrinfo" function which outdated "gethostbyname".
    // It will search for IPv4 addresses using the TCP-Protocol.
    struct addrinfo* targetAdressInfo = NULL;
    DWORD getAddrRes = getaddrinfo("www.google.com", NULL, &hints, &targetAdressInfo);
    if (getAddrRes != 0 || targetAdressInfo == NULL)
    {
        cout << "Could not resolve the Host Name" << endl;
        system("pause");
        WSACleanup();
        return -1;
    }

    // Create the Socket Address Informations, using IPv4
    // We dont have to take care of sin_zero, it is only used to extend the length of SOCKADDR_IN to the size of SOCKADDR
    SOCKADDR_IN sockAddr;
    sockAddr.sin_addr = ((struct sockaddr_in*) targetAdressInfo->ai_addr)->sin_addr;    // The IPv4 Address from the Address Resolution Result
    sockAddr.sin_family = AF_INET;  // IPv4
    sockAddr.sin_port = htons(80);  // HTTP Port: 80

    // We have to free the Address-Information from getaddrinfo again
    freeaddrinfo(targetAdressInfo);

    // Creation of a socket for the communication with the Web Server,
    // using IPv4 and the TCP-Protocol
    SOCKET webSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (webSocket == INVALID_SOCKET)
    {
        cout << "Creation of the Socket Failed" << endl;
        system("pause");
        WSACleanup();
        return -1;
    }

    // Establishing a connection to the web Socket
    cout << "Connecting...\n";
    if(connect(webSocket, (SOCKADDR*)&sockAddr, sizeof(sockAddr)) != 0)
    {
        cout << "Could not connect";
        system("pause");
        closesocket(webSocket);
        WSACleanup();
        return -1;
    }
    cout << "Connected.\n";

    // Sending a HTTP-GET-Request to the Web Server
    const char* httpRequest = "GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n";
    int sentBytes = send(webSocket, httpRequest, strlen(httpRequest),0);
    if (sentBytes < strlen(httpRequest) || sentBytes == SOCKET_ERROR)
    {
        cout << "Could not send the request to the Server" << endl;
        system("pause");
        closesocket(webSocket);
        WSACleanup();
        return -1;
    }

    // Receiving and Displaying an answer from the Web Server
    char buffer[10000];
    ZeroMemory(buffer, sizeof(buffer));
    int dataLen;
    while ((dataLen = recv(webSocket, buffer, sizeof(buffer), 0) > 0))
    {
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
        }
    }

    // Cleaning up Windows Socket Dependencies
    closesocket(webSocket);
    WSACleanup();

    system("pause");
    return 0;
}

संदर्भ:

Gethostbyname का पदावनति

सॉकेट का रिटर्न मान ()

भेजने का मान ()


7

C ++ इसे सीधे करने का कोई तरीका प्रदान नहीं करता है। यह पूरी तरह से इस बात पर निर्भर करेगा कि आपके पास कौन से प्लेटफॉर्म और लाइब्रेरी हैं।

सबसे खराब स्थिति में, आप टीसीपी कनेक्शन स्थापित करने के लिए बढ़ावा देने के लिए :: asio लाइब्रेरी का उपयोग कर सकते हैं, HTTP हेडर (RFC 2616) भेज सकते हैं, और सीधे प्रतिक्रियाओं को पार्स कर सकते हैं। आपकी एप्लिकेशन आवश्यकताओं को देखते हुए, यह करना काफी सरल है।


1
यह करता है - अब, कम से कम। :) stackoverflow.com/a/51959694/1599699
एंड्रयू

@Andrew: यदि आपका "यह" करता है, तो सिब्बरन के "C ++" को सीधे करने का कोई भी तरीका प्रदान नहीं करता है। " , तो जुड़ा हुआ उत्तर मान्य नहीं है क्योंकि यह सिस्टम विशेष का उपयोग करके इसे करने का एक तरीका दिखाता है।
सेबेस्टियन मच

@ SebastianMach मेरा मतलब है, हालांकि यह करता है। बस एक सिस्टम-प्रदत्त लाइब्रेरी आयात करें और एक फ़ंक्शन कॉल करें, और यह आपके लिए काम करता है। अन्य सभी सी ++ विकल्पों के साथ तुलना करें और यह वास्तव में मुश्किल है या 3 पार्टी कोड का उपयोग कर रहा है। मुझे लगता है कि सुंदर प्रत्यक्ष।
एंड्रयू

1
@Andrew: यह केवल विंडोज पर "सिस्टम-प्रदत्त" है। अन्य प्रणालियों पर, यह अलग है। और इसका कोई लेना-देना नहीं है "C ++ इसे सीधे करने का कोई तरीका प्रदान नहीं करता है", जिसका वास्तव में अर्थ है "C ++ मानक नहीं"।
सेबस्टियन मच

@SebastianMach हाँ, लेकिन यह व्यक्तिपरक भी है क्योंकि c ++ भी फोन टैबलेट्स माइक्रोकंट्रोलर आदि पर चलता है। यदि हर एक डिवाइस या OS आसानी से c ++ में कुछ कार्यक्षमता का समर्थन नहीं करता है तो क्या हम इसे सीधे c ++ द्वारा प्रदान नहीं कहते हैं? ओपी ने "c ++ मानक" नहीं कहा, उन्होंने सिर्फ c ++ कहा। ये उत्तर लिनक्स और विंडोज समाधान प्रदान कर रहे हैं, क्योंकि आमतौर पर आप इस तरह से कुछ के लिए उपयोग करेंगे। तो यकीन है, यह एक लिनक्स समाधान नहीं है, लेकिन हाँ, यह सीधे एक प्रमुख ओएस द्वारा प्रदान किया जाता है।
एंड्रयू

6

यहां कुछ कोड दिए गए हैं जो किसी भी 3 पार्टी लाइब्रेरी का उपयोग करने की आवश्यकता के साथ काम करेंगे: पहले अपने गेटवे, उपयोगकर्ता, पासवर्ड और किसी भी अन्य पैरामीटर को निर्धारित करें जिसे आपको इस विशिष्ट सर्वर पर भेजने की आवश्यकता है।

#define USERNAME "user"
#define PASSWORD "your password"
#define GATEWAY "your gateway"

यहाँ कोड ही है:

HINTERNET hOpenHandle, hResourceHandle, hConnectHandle;
const TCHAR* szHeaders = _T("Content-Type:application/json; charset=utf-8\r\n");


hOpenHandle = InternetOpen(_T("HTTPS"), INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (hOpenHandle == NULL)
{
    return false;
}


hConnectHandle = InternetConnect(hOpenHandle,
    GATEWAY,
    INTERNET_DEFAULT_HTTPS_PORT,
    NULL, NULL, INTERNET_SERVICE_HTTP,
    0, 1);

if (hConnectHandle == NULL)
{
    InternetCloseHandle(hOpenHandle);
    return false;
}


hResourceHandle = HttpOpenRequest(hConnectHandle,
    _T("POST"),
    GATEWAY,
    NULL, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_KEEP_CONNECTION,
    1);

if (hResourceHandle == NULL)
{
    InternetCloseHandle(hOpenHandle);
    InternetCloseHandle(hConnectHandle);
    return false;
}

InternetSetOption(hResourceHandle, INTERNET_OPTION_USERNAME, (LPVOID)USERNAME, _tcslen(USERNAME));
InternetSetOption(hResourceHandle, INTERNET_OPTION_PASSWORD, (LPVOID)PASSWORD, _tcslen(PASSWORD));

std::string buf;
if (HttpSendRequest(hResourceHandle, szHeaders, 0, NULL, 0))
{
    while (true)
    {
        std::string part;
        DWORD size;
        if (!InternetQueryDataAvailable(hResourceHandle, &size, 0, 0))break;
        if (size == 0)break;
        part.resize(size);
        if (!InternetReadFile(hResourceHandle, &part[0], part.size(), &size))break;
        if (size == 0)break;
        part.resize(size);
        buf.append(part);
    }
}

if (!buf.empty())
{
    // Get data back
}

InternetCloseHandle(hResourceHandle);
InternetCloseHandle(hConnectHandle);
InternetCloseHandle(hOpenHandle);

यह Win32 API वातावरण पर काम करना चाहिए।

यहाँ एक उदाहरण है


मुझे प्रवेश द्वार के लिए क्या रखना चाहिए? वहाँ कोई प्रवेश द्वार नहीं है ... विन एपीआई इतना बुरा है।
टॉम ज़ातो -

1
"गेटवे" सेवा प्रदाता द्वारा प्रदान की गई URI ( en.wikipedia.org/wiki/Uniform_Resource_Identifier ) के लिए एक सामान्य शब्द है। इसका विंडोज़ से कोई लेना-देना नहीं है।
माइकल हेफ़राती

आह, धन्यवाद। मैंने उस अभिव्यक्ति को URL के लिए उपयोग करने के लिए कभी नहीं सुना, ताकि थोड़े ने मुझे भ्रमित कर दिया। स्पष्टीकरण के लिए धन्यवाद।
टॉम ज़ातो -

ठीक है, मैंने कोड का परीक्षण किया और आपका उदाहरण नहीं मिला। InternetConnectजब पूर्ण URL दिया जाता है, तो शून्य देता है, लेकिन केवल डोमेन नाम प्रदान किए जाने पर गैर-शून्य मान लौटाता है। इसलिए जब मैं उस पृष्ठ को प्राप्त करने के लिए पूर्ण URL का उपयोग करता / करती हूं जिसे मैं डाउनलोड करना चाहता हूं?
टॉम ज़ातो -

उपयोग InternetOpenUrl () InternetConnect () के बजाय यदि आप उपयोग यूआरएल करना चाहते हैं
अल पो

4

अप्रैल, 2020 के लिए अद्यतन उत्तर:

मुझे बहुत सी सफलता मिली है, हाल ही में, cpp-canplplib के साथ (क्लाइंट और सर्वर दोनों के रूप में)। यह परिपक्व है और इसकी अनुमानित, एकल-थ्रेडेड आरपीएस लगभग 6k है।

रक्तस्राव के किनारे पर, वास्तव में आशाजनक रूपरेखा है, cpv- फ्रेमवर्क , जो दो कोर पर लगभग 180k RPS प्राप्त कर सकता है (और कोर की संख्या के साथ अच्छी तरह से स्केल करेगा क्योंकि यह seastar फ्रेमवर्क पर आधारित है , जो सबसे तेज़ DBs को शक्ति प्रदान करता है। ग्रह, scylladb )।

हालाँकि, cpv- फ्रेमवर्क अभी भी अपेक्षाकृत अपरिपक्व है; इसलिए, अधिकांश उपयोगों के लिए, मैं अत्यधिक सीपीपी-कॉन्सप्लिब की सलाह देता हूं।

यह सिफारिश मेरे पिछले जवाब (8 साल पहले) की जगह लेती है ।


धन्यवाद, इसे निकट भविष्य में शायद एक कोशिश दे;)
हैक ०६

मैं वास्तव में 1-फ़ाइल (5K- लाइनों ठीक है) cpp-CANplibib के दृष्टिकोण को पसंद करता हूं। क्या आपको इसके प्रदर्शन के बारे में पता है?
हैक 06

1
@ Hack06 रफ बेंचमार्क लगभग 6000 अनुरोध प्रति सेकंड (RPS) था।
होमर 6

3

C और C ++ में HTTP या सॉकेट कनेक्शन के लिए एक मानक पुस्तकालय नहीं है। इन वर्षों में कुछ पोर्टेबल लाइब्रेरी विकसित की गई हैं। सबसे व्यापक रूप से उपयोग किया जाता है, जैसा कि अन्य ने कहा है, लिबर्कल है

यहाँ एक सूची है libcurl के विकल्पों की (libcurl की वेब साइट से)।

इसके अलावा, लिनक्स के लिए, यह एक सरल HTTP क्लाइंट है। आप अपने स्वयं के सरल HTTP GET क्लाइंट को कार्यान्वित कर सकते हैं, लेकिन यह काम नहीं करेगा यदि प्रमाणीकरण या पुनर्निर्देशन शामिल हैं या यदि आपको प्रॉक्सी के पीछे काम करने की आवश्यकता है। इन मामलों के लिए आपको libcurl जैसी पूर्ण-विकसित लाइब्रेरी की आवश्यकता है।

Libcurl के साथ स्रोत कोड के लिए, यह आप क्या चाहते हैं के सबसे करीब है (Libcurl कई है उदाहरण )। मुख्य कार्य को देखें। सफलतापूर्वक कनेक्शन के बाद HTML सामग्री को बफर में कॉपी किया जाएगा। बस अपने स्वयं के फ़ंक्शन के साथ parseHtml को बदलें।


3

आप एंबेडेस्ट लाइब्रेरी का उपयोग कर सकते हैं । यह हल्का हेडर-ओनली लाइब्रेरी है। इसलिए इसे अपनी परियोजना में शामिल करना आसान है और इसे संकलित करने की आवश्यकता नहीं है.cpp फाइल है।

readme.mdरेपो से उदाहरण का अनुरोध करें :

#include "UrlRequest.hpp"

//...

UrlRequest request;
request.host("api.vk.com");
const auto countryId=1;
const auto count=1000;
request.uri("/method/database.getCities",{
    {"lang","ru"},
    {"country_id",countryId},
    {"count",count},
    {"need_all","1"},
});
request.addHeader("Content-Type: application/json");
auto response=std::move(request.perform());
if(response.statusCode()==200){
  cout<<"status code = "<<response.statusCode()<<", body = *"<<response.body()<<"*"<<endl;
}else{
  cout<<"status code = "<<response.statusCode()<<", description = "<<response.statusDescription()<<endl;
}

Win32 पर संकलन नहीं करता है: /
uhfocuz

@uhfocuz का परिवाद iOS और Android के लिए लिखा गया है। लेकिन मैं आपको Win32 के लिए इसे संकलित करने में मदद कर सकता हूं। यह बहुत मुश्किल नहीं है
fnc12

मुझे लगता है कि यह मेरे उपयोग के लिए कितना हल्का है, यह मेरे मैक पर ठीक ठीक संकलित है, लेकिन विंडोज पर काम अलग हैं जैसे कि आपके पास नहीं हैं netdb.hआदि इसलिए मैं कुछ मदद करना चाहता हूं हाँ
uhfocuz

@uhfocuz आपको बस इतना करना है कि जैसी शर्तें हैं #ifdef _WIN32और वहां पर विंडोज़ विशिष्ट कोड जोड़ें। देखो यहाँ - वहाँ यूनिक्स सॉकेट और खिड़कियों सॉकेट के बीच कोई ज्यादा अंतर नहीं है। मुझे दो मुख्य अंतर दिखाई देते हैं: 1) कॉल 1 WSAStartupऔर 2) के closesocketबजायclose
fnc12

@uhfocuz कृपया मेरे रेपो में एक मुद्दा बनाएं - मेरे पास पर्याप्त समय होने पर win32 समर्थन जोड़ देगा
fnc12

3

HTTP प्रोटोकॉल बहुत सरल है, इसलिए HTTP क्लाइंट लिखना बहुत सरल है। यहाँ एक है

https://github.com/pedro-vicente/lib_netsockets

यह एक वेब सर्वर से एक फाइल को पुनः प्राप्त करने के लिए HTTP GET का उपयोग करता है, सर्वर और फाइल दोनों कमांड लाइन पैरामीटर हैं। दूरस्थ फ़ाइल को स्थानीय प्रति में सहेजा जाता है।

डिस्क्लेमर: मैं लेखक हूं

संपादित करें: संपादित किया गया URL


URL अमान्य है।
श्रवण ४०

3

ध्यान दें कि इसके लिए libcurl, Windows.h, या WinSock की आवश्यकता नहीं है! पुस्तकालयों का कोई संकलन, कोई परियोजना विन्यास आदि नहीं। मेरे पास विंडोज 10 पर विजुअल स्टूडियो 2017 सी ++ में काम करने वाला यह कोड है:

#pragma comment(lib, "urlmon.lib")

#include <urlmon.h>
#include <sstream>

using namespace std;

...

IStream* stream;
//Also works with https URL's - unsure about the extent of SSL support though.
HRESULT result = URLOpenBlockingStream(0, "http://google.com", &stream, 0, 0);
if (result != 0)
{
    return 1;
}
char buffer[100];
unsigned long bytesRead;
stringstream ss;
stream->Read(buffer, 100, &bytesRead);
while (bytesRead > 0U)
{
    ss.write(buffer, (long long)bytesRead);
    stream->Read(buffer, 100, &bytesRead);
}
stream.Release();
string resultString = ss.str();

मुझे लगा कि यह कैसे करना है, जैसा कि मुझे एक साधारण एपीआई एक्सेस स्क्रिप्ट चाहिए थी, लाइब्रेरेल जैसे पुस्तकालय मुझे सभी प्रकार की समस्याएं पैदा कर रहे थे (यहां तक ​​कि जब मैंने निर्देशों का पालन किया ...), और विनसॉक सिर्फ निम्न-स्तरीय और जटिल है ।

मैं IStream रीडिंग कोड (विशेषकर जबकि हालत - सही / सुधार के लिए स्वतंत्र महसूस) के बारे में बिल्कुल निश्चित नहीं हूँ , लेकिन हे, यह काम करता है , परेशानी मुक्त! (यह मेरे लिए समझ में आता है कि, जब से मैंने एक अवरोधक (सिंक्रोनस) कॉल का उपयोग किया है , यह ठीक है, यह bytesReadहमेशा तब तक 0U होगा जब तक कि स्ट्रीम ( ISequentialStream ?) समाप्त न हो जाए, लेकिन कौन जानता है।)

इन्हें भी देखें: URL मॉनीकर्स और एसिंक्रोनस प्लगगेबल प्रोटोकॉल संदर्भ


इसे संपादित किया गया था, लेकिन सी ++ में उचित मात्रा में अनुभव के बाद, मैं अपने मूल दावे के साथ खड़ा होने जा रहा हूं कि यह शायद सबसे आसान तरीका है जिसे आप कभी भी इस तरह से सी ++ में कर पाएंगे ... (एट कम से कम अभी के लिए ...)
एंड्रयू

मैंने अभी कुछ URL से badssl.com (सुंदर काम) के साथ URLOpenBlockingStream का परीक्षण किया है , और SSL प्रमाणपत्र खराब होने पर यह ऑपरेशन विफल हो जाएगा। हर मामले में मैंने परीक्षण किया (सिर्फ कुछ), उपरोक्त कोड का आउटपुट एक रिक्त स्ट्रिंग (कोई स्ट्रीम डेटा नहीं) होगा। तो यह बहुत अच्छा है।
एंड्रयू

मुझे लगता है कि यह सबसे आसान है, लेकिन आपको http प्रतिक्रिया कोड कैसे मिलेगा?
रॉबिन

@ रोबिन हा! आप संदेश और प्रतिक्रिया कोड चाहते थे ?! आप जानते हैं कि मैं भी करता हूँ, सिवाय इसके कि यदि आप प्रलेखन को देखें और अधिक मैनुअल URL मोनिकर सामान देखें तो आपको उत्तर मिल सकता है। मुझे लगता है कि किसी को कोड ऑनलाइन पोस्ट करने वाले URLOpenBlockingStream को मैन्युअल रूप से याद करना चाहिए, जो अधिक कॉन्फ़िगरेशन के लिए अनुमति देगा। मुझे पता है अगर तुम कुछ भी पता लगाने!
एंड्रयू

यह भी है कि मैंने अभी-अभी पाया: docs.microsoft.com/en-us/windows/desktop/WinInet/… कोई विचार नहीं है अगर यह किसी भी अच्छा है।
एंड्रयू

2

यहाँ कुछ (अपेक्षाकृत) सरल C ++ 11 कोड है जो URL में सामग्री को डाउनलोड करने के लिए libCURL का उपयोग करता है std::vector<char> :

http_download.hh

# pragma once

#include <string>
#include <vector>

std::vector<char> download(std::string url, long* responseCode = nullptr);

http_download.cc

#include "http_download.hh"

#include <curl/curl.h>
#include <sstream>
#include <stdexcept>

using namespace std;

size_t callback(void* contents, size_t size, size_t nmemb, void* user)
{
  auto chunk = reinterpret_cast<char*>(contents);
  auto buffer = reinterpret_cast<vector<char>*>(user);

  size_t priorSize = buffer->size();
  size_t sizeIncrease = size * nmemb;

  buffer->resize(priorSize + sizeIncrease);
  std::copy(chunk, chunk + sizeIncrease, buffer->data() + priorSize);

  return sizeIncrease;
}

vector<char> download(string url, long* responseCode)
{
  vector<char> data;

  curl_global_init(CURL_GLOBAL_ALL);
  CURL* handle = curl_easy_init();
  curl_easy_setopt(handle, CURLOPT_URL, url.c_str());
  curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, callback);
  curl_easy_setopt(handle, CURLOPT_WRITEDATA, &data);
  curl_easy_setopt(handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  CURLcode result = curl_easy_perform(handle);
  if (responseCode != nullptr)
    curl_easy_getinfo(handle, CURLINFO_RESPONSE_CODE, responseCode);
  curl_easy_cleanup(handle);
  curl_global_cleanup();

  if (result != CURLE_OK)
  {
    stringstream err;
    err << "Error downloading from URL \"" << url << "\": " << curl_easy_strerror(result);
    throw runtime_error(err.str());
  }

  return move(data);
}

2

आम तौर पर मैं कुछ क्रॉस-प्लेटफ़ॉर्म जैसे कि CURL, POCO या Qt की सलाह देता हूँ। हालाँकि, यहाँ एक विंडोज उदाहरण है !:

#include <atlbase.h>
#include <msxml6.h>
#include <comutil.h> // _bstr_t

HRESULT hr;
CComPtr<IXMLHTTPRequest> request;

hr = request.CoCreateInstance(CLSID_XMLHTTP60);
hr = request->open(
    _bstr_t("GET"),
    _bstr_t("https://www.google.com/images/srpr/logo11w.png"),
    _variant_t(VARIANT_FALSE),
    _variant_t(),
    _variant_t());
hr = request->send(_variant_t());

// get status - 200 if succuss
long status;
hr = request->get_status(&status);

// load image data (if url points to an image)
VARIANT responseVariant;
hr = request->get_responseStream(&responseVariant);
IStream* stream = (IStream*)responseVariant.punkVal;
CImage *image = new CImage();
image->Load(stream);
stream->Release();

2

यदि आप C ++ में एक HTTP क्लाइंट लाइब्रेरी की तलाश कर रहे हैं जो रेस्टफुल वेब सेवाओं के उपभोग के लिए कई प्लेटफार्मों (लिनक्स, विंडोज और मैक) में समर्थित है। आपके पास नीचे विकल्प हो सकते हैं।

  1. क्यूटी नेटवर्क लाइब्रेरी - एप्लिकेशन को नेटवर्क अनुरोध भेजने और उत्तर प्राप्त करने की अनुमति देता है
  2. C ++ REST SDK - PPL समर्थन के साथ एक उभरती हुई तृतीय-पक्ष HTTP लाइब्रेरी है
  3. Libcurl - यह शायद देशी दुनिया में सबसे अधिक इस्तेमाल किया जाने वाला http काम है।

1

हालांकि थोड़ी देर। आप https://github.com/Taymindis/backcurl पसंद कर सकते हैं ।

यह आपको मोबाइल सी ++ विकास पर http कॉल करने की अनुमति देता है। मोबाइल गेम डेवलपमेंट के लिए उपयुक्त है

bcl::init(); // init when using

bcl::execute<std::string>([&](bcl::Request *req) {
    bcl::setOpts(req, CURLOPT_URL , "http://www.google.com",
             CURLOPT_FOLLOWLOCATION, 1L,
             CURLOPT_WRITEFUNCTION, &bcl::writeContentCallback,
             CURLOPT_WRITEDATA, req->dataPtr,
             CURLOPT_USERAGENT, "libcurl-agent/1.0",
             CURLOPT_RANGE, "0-200000"
            );
}, [&](bcl::Response * resp) {
    std::string ret =  std::string(resp->getBody<std::string>()->c_str());
    printf("Sync === %s\n", ret.c_str());
});


bcl::cleanUp(); // clean up when no more using

0

ऐसा करने के लिए आप ACE का उपयोग कर सकते हैं:

#include "ace/SOCK_Connector.h"

int main(int argc, ACE_TCHAR* argv[])
{
    //HTTP Request Header
    char* szRequest = "GET /video/nice.mp4 HTTP/1.1\r\nHost: example.com\r\n\r\n"; 
    int ilen = strlen(szRequest);

    //our buffer
    char output[16*1024];

    ACE_INET_Addr server (80, "example.com");
    ACE_SOCK_Stream peer;
    ACE_SOCK_Connector connector;
    int ires = connector.connect(peer, server);
    int sum = 0;
    peer.send(szRequest, ilen);
    while (true)
    {
        ACE_Time_Value timeout = ACE_Time_Value(15);
        int rc = peer.recv_n(output, 16*1024, &timeout);
        if (rc == -1)
        {
            break;
        }
        sum += rc;
    }
    peer.close();
    printf("Bytes transffered: %d",sum);

    return 0;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.