|
You last visited: Today at 11:56
Advertisement
[C++/CURL] HttpDownloader
Discussion on [C++/CURL] HttpDownloader within the Coding Releases forum part of the Coders Den category.
04/09/2013, 15:47
|
#1
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
[C++/CURL] HttpDownloader
Gleichmal vorweg: Die Klasse ist unvollständig, teilweise vielleicht auch buggy, erst frisch fertig geworden und äußerst häßlich ohne großartige Strukturierung oder Kommentare in eine Datei gehakt.
Dennoch möchte ich sie mit euch teilen.
Beschreibung: Ich muss für ein Projekt Dateien via Http (später vielleicht auch noch FTP, weswegen es vielleicht noch eine Abstrakte Downloaderklasse geben wird) laden. Dazu benutze ich CURL, dessen typisches C-Interface halt nicht wirklich gut in die C++ Welt passt. Aus diesem Grund ist ne kleine HttpDownload-Klasse erstanden, welche die C-Callbacks in Einklang mit der C++ Welt bringt. Sowohl Userdaten, als auch Callbacks hab ich versucht, typsicher zu machen.
Hier jedenfalls mal die (unvollständige!) Klasse:
Verwendung:
Die Klasse benötigt als template-Parameter die Typen für die Userdaten von write-callback und progress-callback (beide standardmäßig void).
Die Signatur für die Callbacks seht ihr im angeführten Beispiel. Der erste Parameter vom Typ bool& besimmt, ob die Callbacks für dieses Event weiter abgearbeitet werden sollen (standardmäßig true). Aus dem write-callback einfach ein false zurückgeben um den Download zu beenden (ist noch als quick&dirty-Lösung implementiert).
Code:
#include <iostream>
#include "HttpDownloader.h"
int main()
{
int totalSize = 0;
int counter = 0;
HttpDownloader<int, void> dl("http://www.elitepvpers.com/forum/images/bullet/misc/logostrip_l.gif", &counter);
auto f = [&totalSize](bool&, size_t size, char*, int* user) {
totalSize += size;
++(*user);
return true;
};
auto pf = [](bool&, double now, double total, void*) {
std::cout << "received " << now << " of " << total << " bytes\n";
};
dl.add_data_callback(f);
dl.add_progress_callback(pf);
dl.start();
std::cout << "received " << totalSize << " bytes\n";
std::cout << "data callback called " << counter << " times\n";
}
Wie gesagt, wirds noch ne viele, viele Änderungen geben - ggf steig ich auch komplett auf boost::signal um.
Vielleicht kann ja doch jemand was damit anfangen,
Gruß
|
|
|
04/09/2013, 16:19
|
#2
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Quote:
|
Dazu benutze ich CURL, dessen typisches C-Interface halt nicht wirklich gut in die C++ Welt passt.
|
Wieso nicht cURLpp? Die VS-Projektmappe ist zwar recht unaufgeräumt, aber insgesamt ein recht ordentlicher C++ Wrapper.
Naja, vielleicht wäre das auch ein bisschen Overload für deinen Verwendungszweck - nur ein Vorschlag^^
|
|
|
04/09/2013, 16:25
|
#3
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Quote:
|
Wieso nicht cURLpp? Die VS-Projektmappe ist zwar recht unaufgeräumt, aber insgesamt ein recht ordentlicher C++ Wrapper.
|
Weil ich mich einfmal damit rumgeschlagen hab und es mir einfach sowas von garnicht gefallen hat. Ich brauch ausserdem keine komplexen Requests, weswegen mir n dünner Wrapper überm C-Interface reicht.
Trotzdem nichts gegen die Leute, denen cURLpp gefällt.
Edit: Habs mir das Projekt nach deinem Post nochmal angeschaut und es scheint tot zu sein. Die Versionen, die ich finde, sind 4-5 Jahre alt.
|
|
|
04/09/2013, 20:12
|
#4
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Quote:
|
Edit: Habs mir das Projekt nach deinem Post nochmal angeschaut und es scheint tot zu sein. Die Versionen, die ich finde, sind 4-5 Jahre alt.
|
Habe mich vor kurzem reingearbeitet und auch wenn es recht alt ist, ist es immer noch wesentlich angenehmer als mit der libcurl zu arbeiten. Jo, die letzte Version ist anscheinend 3,5 Jahre alt, jedoch funktioniert sie (bis jetzt) super mit der neusten libcurl Version 7.29.0.
Aber wie gesagt, für deinen Zweck reicht denke ich deine Klasse vollkommen - wollte nur drauf hinweisen.
|
|
|
04/09/2013, 20:49
|
#5
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Quote:
|
Habe mich vor kurzem reingearbeitet und auch wenn es recht alt ist, ist es immer noch wesentlich angenehmer als mit der libcurl zu arbeiten
|
Kann ich so nicht unterstreichen. Bin auch der Meinung, dass C in nem C++-Source so gut wie nie verwendet werden soll, aber libcurl bietet ein äußerst angenehmes Interface. Ich (und auch viele andere) haben sich mit curlpp vom Kompilieren bis zum Benutzen rumgeschlagen. Ich will nicht bestreiten, dass curlpp nicht auch gut sein kann - bestimmt ist es dank RAII, Operator-Overloading und andere C++-Schmankerl sogar auch sehr gut zu benutzen.
Dennoch würde ich von einem Projekt, dass Tod ist (wenn immer möglich), die Finger lassen. Support gibt es dann keinen mehr und auch schwerwiegende Bugs können sich noch irgendwo verstecken (fällt das dann zu spät oder/und beim Kunden auf, kann das Geschrei groß werden).
Auch ist hier ja nicht garantiert, dass alle Features jetzt oder in Zukunft funktionieren, da es ja keinen Support mehr gibt.
Quote:
|
Aber wie gesagt, für deinen Zweck reicht denke ich deine Klasse vollkommen - wollte nur drauf hinweisen.
|
Danke dir dafür (wirklich), ich hatte das Projekt schon vergessen (verdrängt?).
Ne richtig gut gelungene Netzwerk-Lib (die auf modernes C++ setzt) ist neben boost::asio auch  (wirklich einen Blick wert!).
Gruß
|
|
|
11/27/2013, 13:30
|
#6
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Quote:
|
Ne richtig gut gelungene Netzwerk-Lib (die auf modernes C++ setzt) ist neben boost::asio auch netlib (wirklich einen Blick wert!).
|
Ich belebe diesen Thread mal wieder, da ich mir wirklich Mühe gegeben habe, die cpp-netlib zu benutzen. Leider benötigt aktuelle Stable Version die statischen Boost-Bibliotheken und ist voll mit Bugs wie  hier, die immer noch nicht in der Stable Version gefixt wurden. Die Git Version buggt auch noch an etlichen Stellen (bestimmte Bibliotheken wurden nicht mitgelinkt) und leider habe ich das nicht auf die Reihe bekommen, das Ganze zu kompilieren. Im Arch Repo gibts die Library auch nicht und das AUR liefert nur die Header Dateien.
Sorry, aber cURLPP konnte mir bisher einen wesentlich zuverlässligeren Dienst als cpp-netlib erweisen. boost::asio scheidet aus, da es sich dabei eher um eine Lowlevel-Bibliothek handelt als um eine HTTP-Bibliothek.
|
|
|
 |
Similar Threads
|
cURL - Wie erstellen?
12/10/2012 - Web Development - 1 Replies
Hallo,
Wie kann ich so dynamische URLs erstellen.
Example:
/register.php?step=1
/register.php?step=2
/register.php?step=done
und halt für Benutzer:
|
PHP upload mittels curl
09/10/2012 - Web Development - 1 Replies
Hi,
ich habe folgendes Problem, ich möchte gerne eine Datei von meinem Server auf einen anderen Server (Video Hoster) hochladen nur will dies nicht funktionieren. Es werden auch keine Errors angezeigt.
Hier ist einmal das Script:
<?php
class curl
{
function __construct($use = 1)
|
PHP - cURL Cookie Problem
08/19/2011 - Web Development - 6 Replies
Hallo,
ich möchte eine Chinesische Seite sogesagt übersetzen. Dazu habe ich mir gedacht das ich ein Formular auf Deutsch mache und den Post an die chinesische Seite schicke.
Leider bekomme ich eine Fehlermeldung von der Seite aus das die Cookies deaktiviert sind oder so.
Nun weiß ich nicht weiter. Cookies sind laut Script an und sollten eig. weitergegebene werden.
Könnt ihr mir helfen?
<?PHP
session_start();
if (isset($_POST) && ($_POST == "Registrieren")){...
|
help with curl
05/20/2011 - CO2 Programming - 0 Replies
im trying to log in to a page using curl to modify one of my post like updating that specific post with new information over the time
i dont understand very much curl and most of the examples i search are in php and i need it to use with autoit or the cmd directly
right now im trying from the start, to get logged in the webpage
i have found that i need the names of the inputs user and password and that i need a cookie to receive and to send, but when i check the curl.txt in a browser it...
|
[PHP] cUrl Login
04/19/2010 - Web Development - 0 Replies
So ich hab ein kleines Problem. Und zwar versuche ich für das Browsergame
Space Pioneers einen Bot mit PHP zu schreiben was generell auch kein Problem
wäre, allerdings habe ich ein kleines Problem. Und zwar gibt es zwei möglichkeiten
sich einzuloggen, das wäre einmal auf Looki und einmal der Notfall Login Login. Nun zu meinem Problem. Das
Einloggen im ersten Link
klappt soweit ganz gut, ich habe meines errachtens auch alle Inputs mit übergeben,
hat mir allerdings keinen Acceskey...
|
All times are GMT +1. The time now is 11:56.
|
|