ASIO
-
Ich hab mir grad ASIO (http://asio.sourceforge.net) angeschaut, die Netzwerkklasse, die in BOOST integriert ist und wahrscheinlich auch in C++0x reinkommen soll.
Mir gefaellt die Library nicht, deswegen moecht ich jetzt einfach mal hoeren was eure Meinung zu ASIO ist und was ihr davon haltet.
Meine Ablehnung mag daran liegen dass ich die Funktionalitaet nur ueberflogen habe, und dass ich in letzter Zeit kaum C++ geschrieben habe, und deswegen einfach "anderen Umgang" gewohnt bin. Jedenfalls sind hier einige der Dinge, die mir negativ aufgefallen, z. B.:
* Wozu muss ich asio::io_service Objekte erstellen, in Java oder Python gehts auch ohne? (Allgmein faellt mir auf das in den Sprachen Networking netter ist
)
* Wozu die Asynchronitaet? Ist zwar ein netter Zusatz, aber das kann ich mir mit Threads selber nachbauen. Ein Sprachstandard (gerade bei einer Sprache wie C++, die ja eher schlanke Std. Libraries hat) braucht das nicht.
* Die ganzen Umwege ueber resolver, resolver::query und resolver::iterator nur um eine Verbindung zu erstellen leuchten mir auch nicht ein.
* Warum:size_t len = socket.read_some( asio::buffer(buf), asio::assign_error(error)); if (error == asio::error::eof) ... blablablaAnstatt einfach eine Exception zu werfen?
-
koenntest du die quelle angeben in der steht dass das in C++0x reinkommt? an sich sollen ja nicht viele dinger der boost in den standard, wundert mich also dass gerade ASIO rein soll.
-
Welche Version hast du denn herunter geladen? Ich selbst bin kein asio-Nutzer, aber beobachte es interessiert. Ich vermute, du hast eine alte asio-Version die nichts mit der zu tun hat, die evtl. in den TR2 rein kommen soll (ist noch nicht verabschiedet).
Denn deine Kritik kann ich nicht ganz nachvollziehen. Hier alles noch mal durchzukauen würde redundantz erzeugen, denn es gab seeeeeeeeeeeeeeeeeehr lange Diskussionen in der Boost-Dev-Liste, als es das Review gab. Entsprechend wurde in der Zwischenzeit viel an asio umgebaut, auch an den Konzepten.
Am besten mal ein kleiner Client, das die Einfachheit von asio aufzeigt:
asio::ip::tcp::iostream s(host_adr, "daytime"); std::string line; std::getline(s, line); std::cout << line << std::endl;Also, ich öffne einen tcp/ip-Stream und übergebe eine URL. Erstelle ein String auf dem Stack, und hole den ersten String über den tcp/ip-Stream. Am Ende gebe ich den Kram auf der Konsole aus.
Wie kurz soll der Netzwerk-Code denn noch werden? 
Einen Server bauen, der einen String rausschickt, ist ebenfalls pipifax. Sind nur zwei bis drei Zeilen mehr.
* Wozu die Asynchronitaet? Ist zwar ein netter Zusatz, aber das kann ich mir mit Threads selber nachbauen.
Hätte es die asynchronität nicht gegeben, hätten alle gefragt, warum das ganze nicht von asio unterstützt wird.
Viele Konzepte in asio dienen rein der Skalierbarkeit. Ich selbst habe die Diskussion in boost-dev nur verfolgt, aber so wie ich es verstanden habe, war die Anforderung Skalierbarkeit. asio und somit C++ muß halt eine Vormachtstellung ggü. anderen Sprachen/Platformen bewahren. Und das ist nunmal Performance bei steigender Last.
Mittlerweile wurde aber asio auch für Einsteiger vereinfacht, was beim Review zu Weihnachten 2005 noch nicht gegeben war. Und wenn man sich die Samples anschaut, ist es heute einfacher geworden.
Achja, und asio wird erstmal nicht in C++0x reinkommen, sondern wie viele andere Lib-Erweiterungen in einen TR.
-
rapso schrieb:
koenntest du die quelle angeben in der steht dass das in C++0x reinkommt? an sich sollen ja nicht viele dinger der boost in den standard, wundert mich also dass gerade ASIO rein soll.
http://open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1974.html
„Boost (www.boost.org) has recently accepted the asio asynchronous I/O library, and there are plans to morph this library into a full-fledged networking library. Because the C++ committee [N1810] has specifically identified networking as an area of interest, part of the development process could be to prepare a TR2 proposal for the library.“
-
Artchi schrieb:
Welche Version hast du denn herunter geladen? Ich selbst bin kein asio-Nutzer, aber beobachte es interessiert. Ich vermute, du hast eine alte asio-Version die nichts mit der zu tun hat, die evtl. in den TR2 rein kommen soll (ist noch nicht verabschiedet).
Denn deine Kritik kann ich nicht ganz nachvollziehen. Hier alles noch mal durchzukauen würde redundantz erzeugen, denn es gab seeeeeeeeeeeeeeeeeehr lange Diskussionen in der Boost-Dev-Liste, als es das Review gab. Entsprechend wurde in der Zwischenzeit viel an asio umgebaut, auch an den Konzepten.
Am besten mal ein kleiner Client, das die Einfachheit von asio aufzeigt:
asio::ip::tcp::iostream s(host_adr, "daytime"); std::string line; std::getline(s, line); std::cout << line << std::endl;Ich habe mir keine Version runtergeladen, sondern nur die Dokumentation durchgeschaut, die ich unter http://asio.sourceforge.net/boost_asio_0_3_7/libs/asio/doc/ gefunden habe. Ich seh grad dass dein Beispiel dort auch zu finden war, allerdings "weiter hinten", soweit hatte ich noch nicht geschaut, war also evtl. etwas voreilig

* Wozu die Asynchronitaet? Ist zwar ein netter Zusatz, aber das kann ich mir mit Threads selber nachbauen.
Hätte es die asynchronität nicht gegeben, hätten alle gefragt, warum das ganze nicht von asio unterstützt wird.
Das Argument versteh ich nicht ganz, da mit Threading + synchronem Netzwerk-IO ja die Mittel zur Verfuegung stehen, das ganze selbst zu bauen. Aber vielleicht will das Standardkomitee ja wirklich die Library um mehr als das "bare Minimum" erweitern

Achja, und asio wird erstmal nicht in C++0x reinkommen, sondern wie viele andere Lib-Erweiterungen in einen TR.
Ich dachte TR1 und TR2 werden beide in C++0x uebernommen?
-
Blue-Tiger schrieb:
* Warum:
size_t len = socket.read_some( asio::buffer(buf), asio::assign_error(error)); if (error == asio::error::eof) ... blablablaAnstatt einfach eine Exception zu werfen?
Imho geht beides. Man kann wohl boost::asio::error auch fangen,
wie z.b. im chatserver-example
-
Blue-Tiger schrieb:
* Wozu die Asynchronitaet? Ist zwar ein netter Zusatz, aber das kann ich mir mit Threads selber nachbauen. Ein Sprachstandard (gerade bei einer Sprache wie C++, die ja eher schlanke Std. Libraries hat) braucht das nicht.
Weil Threads nicht so gut skalieren. Es ist eben verdammt aufwendig, schnelles AIO plattformunabhängig zu implementieren. Linux 2.6 epoll, Linux 2.4 SIGIO, *BSD/OSX kqueue, Windows ?? etc.
Ich finde das schon gut.
-
rüdiger schrieb:
Blue-Tiger schrieb:
* Wozu die Asynchronitaet? Ist zwar ein netter Zusatz, aber das kann ich mir mit Threads selber nachbauen. Ein Sprachstandard (gerade bei einer Sprache wie C++, die ja eher schlanke Std. Libraries hat) braucht das nicht.
Weil Threads nicht so gut skalieren. Es ist eben verdammt aufwendig, schnelles AIO plattformunabhängig zu implementieren. Linux 2.6 epoll, Linux 2.4 SIGIO, *BSD/OSX kqueue, Windows ?? etc.
http://asio.sourceforge.net/asio-0.3.7/doc/design/designimplementation.html
-
Das Argument versteh ich nicht ganz, da mit Threading + synchronem Netzwerk-IO ja die Mittel zur Verfuegung stehen, das ganze selbst zu bauen. Aber vielleicht will das Standardkomitee ja wirklich die Library um mehr als das "bare Minimum" erweitern
Es gibt ja noch keine Threads im C++0x und auch in keinem TR. Wäre also etwas inkonsistent. Ein paar Leute hatten auch in der boost-dev gefragt, warum z.B. boost::thread nicht eingesetzt wird. Aber das Argument war, das man dieses für die Implementierung nutzen kann. Das Interface von asio soll davon aber nichts zeigen. Ich pers. finde es nicht schlecht, wenn die Details versteckt werden und ich nur im asio-Style sage, was ich haben will und asio erledigt den Rest.
Ich dachte TR1 und TR2 werden beide in C++0x uebernommen?
nein, TRs sind Erweiterungen die für sich alleine stehen. Die TRs _könnten_ mit in den C++0x einfliessen, und wenn, dann vielleicht nur zu teilen. Also, nichts genaues weiß man nicht.

-
Artchi schrieb:
Das Argument versteh ich nicht ganz, da mit Threading + synchronem Netzwerk-IO ja die Mittel zur Verfuegung stehen, das ganze selbst zu bauen. Aber vielleicht will das Standardkomitee ja wirklich die Library um mehr als das "bare Minimum" erweitern
Es gibt ja noch keine Threads im C++0x und auch in keinem TR. Wäre also etwas inkonsistent. Ein paar Leute hatten auch in der boost-dev gefragt, warum z.B. boost::thread nicht eingesetzt wird. Aber das Argument war, das man dieses für die Implementierung nutzen kann. Das Interface von asio soll davon aber nichts zeigen. Ich pers. finde es nicht schlecht, wenn die Details versteckt werden und ich nur im asio-Style sage, was ich haben will und asio erledigt den Rest.
Wenn man von "asio-Style" sprechen kann gibt mir das zu denken. Ich hätte es lieber wenn alles "aus einem Guss" ist. Aber ich wusste nicht dass Threads noch nicht im TR sind

nein, TRs sind Erweiterungen die für sich alleine stehen. Die TRs _könnten_ mit in den C++0x einfliessen, und wenn, dann vielleicht nur zu teilen. Also, nichts genaues weiß man nicht.

Dann verstehe ich den Sinn von TRs nicht ganz. Sie das dann "offizielle Erweiterungen der Standardbibliothek", aber nicht des Sprachstandards?
-
Ja, TRs sind offizielle Erweiterungen zur Standard-Lib. Wenn dir der Sinn von TRs nicht klar ist, solltest du meinen aktuellen Artikel im C++ Magazin lesen.

Schau doch einfach in den TR1-Draft rein oder in die TR1-Doku bei Dinkumware (die bieten schon eine TR1-Implementirung an!). Dann weißt du was im TR1 drin ist. TR2 ist in Arbeit und man kann dazu absolut noch nichts sagen. Somit kann sich auch asio nicht darauf verlassen, den User selbst Threading einzusetzen. Was ist wenn es boost::thread nicht in den TR2 schafft?
Würde asio ganz schön schlecht da stehen. Und es würde zus. wohl auch nicht in den TR2 rein kommen. Ein Teufelskreis.
Also sollte man froh sein, wenn asio gleich alles von Haus aus anbietet und es eigenständig ohne Abhägigkeit in den TR2 gewählt wird.