{"id":7160,"date":"2021-04-03T16:35:54","date_gmt":"2021-04-03T14:35:54","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=7160"},"modified":"2021-04-03T16:35:55","modified_gmt":"2021-04-03T14:35:55","slug":"http-anfragen-mit-curl-in-c-senden-inklusive-installation-der-library","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/http-anfragen-mit-curl-in-c-senden-inklusive-installation-der-library\/","title":{"rendered":"HTTP-Anfragen mit curl in C++ senden inklusive Installation der Library"},"content":{"rendered":"<p>C++ bietet keine eingebaute Bibliothek f\u00fcr HTTP-Anfragen, wie C# mit der WebClient bzw. HttpWebRequest Klasse. Statt das Protokoll selbst mit Sockets zu implementieren, stehen jedoch andere Bibliotheken zur Verf\u00fcgung. Eine der verbreitetsten ist curl, bekannt durch das gleichnamige Kommandozeilenwerkzeug. Es wird jedoch auch eine C-Bibliothek angeboten. Zun\u00e4chst m\u00fcssen wir diese installieren, unter Debian\/Ubuntu via apt-get Paketverwaltung:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt-get install libcurl4-openssl-dev\n<\/pre>\n<\/div>\n<p>Der gcc Compiler ist unter vielen Distributionen bereits installiert. Falls nicht, kann er in der Regel \u00fcber das gleichnamige Paket nachinstalliert werden. Als Beispiel dient folgender C++ Code. Er f\u00fchrt eine HTTP GET Anfragen an example.com mittels der curl Bibliothek durch. Im Anschluss wird der HTML Body zusammen mit den Antwortheadern des Webservers auf der Konsole ausgegeben:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\n#include &lt;string&gt;\n#include &lt;iostream&gt;\n#include &lt;curl\/curl.h&gt;\n\nusing namespace std;\n\nsize_t writeFunction(void* ptr, size_t size, size_t nmemb, std::string* data) {\n    data-&gt;append((char*)ptr, size * nmemb);\n    return size * nmemb;\n}\n\nint main(int argc, char** argv) {\n    curl_global_init(CURL_GLOBAL_DEFAULT);\n    auto curl = curl_easy_init();\n    string url = &quot;http:\/\/example.com\/&quot;;\n    if(!curl) {\n        printf(&quot;Initialisierung von curl fehlgeschlagen!&quot;);\n        return 1;\n    }\n\n    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());\n    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);\n    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L);\n    curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);\n\n    std::string response_string;\n    std::string header_string;\n    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunction);\n    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &amp;response_string);\n    curl_easy_setopt(curl, CURLOPT_HEADERDATA, &amp;header_string);\n\n    curl_easy_perform(curl);\n    cout &lt;&lt; response_string &lt;&lt; &quot;\\n\\n&quot; &lt;&lt; header_string;\n\n    curl_easy_cleanup(curl);\n    curl_global_cleanup();\n    curl = NULL;  \n    return 0;\n}\n<\/pre>\n<\/div>\n<p>Den Code m\u00fcssen wir nun kompilieren sowie mit der curl\/Standard C++ Bibliothek linken. Anschlie\u00dfend kann man die erzeugte Binary ausf\u00fchren. Sie sollte uns den HTML Quelltext der GET-Anfrage auf example.com ausgeben, sowie anschlie\u00dfend den HTTP Antwortheader:<\/p>\n<div class=\"wp-block-syntaxhighlighter-code \">\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n$ gcc curl.cc -lcurl -lstdc++ -o curl.run &amp;&amp; .\/curl.run\n&lt;!doctype html&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;Example Domain&lt;\/title&gt;\n...\nHTTP\/1.1 200 OK\nAge: 420631\nCache-Control: max-age=604800\n...\n<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>C++ bietet keine eingebaute Bibliothek f\u00fcr HTTP-Anfragen, wie C# mit der WebClient bzw. HttpWebRequest Klasse. Statt das Protokoll selbst mit Sockets zu implementieren, stehen jedoch andere Bibliotheken zur Verf\u00fcgung. Eine der verbreitetsten ist curl, bekannt durch das gleichnamige Kommandozeilenwerkzeug. Es wird jedoch auch eine C-Bibliothek angeboten. Zun\u00e4chst m\u00fcssen wir diese installieren, unter Debian\/Ubuntu via apt-get &#8230;<\/p>\n","protected":false},"author":5,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[863,839,335],"class_list":["post-7160","post","type-post","status-publish","format-standard","hentry","category-softwareentwicklung","tag-c-2","tag-curl","tag-http"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7160","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=7160"}],"version-history":[{"count":2,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7160\/revisions"}],"predecessor-version":[{"id":7162,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/7160\/revisions\/7162"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=7160"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=7160"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=7160"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}