Linux Netzwerkprogrammierung (TCP, XML)



  • Hallo,
    aus einem C++-Programm würde ich gerne auf eine Netzwerkressource via TCP zugreifen.

    Ist es sinnvoll, das üper C-Sockets zu realisieren, oder gibt es Bibliotheken, mit Hilfe derer das komfortabler geht?

    Da es sich voraussichtlich um einen Webservice handelt, brauche ich auch irgendetwas, um XML zu verarbeiten.

    Komme aus der C#-Welt und bin für jeden Tipp dankbar!

    Viele Grüße
    bibe



  • Natürlich gibt's da Bibliotheken, mit denen das eleganter geht. Boost hat mit ASIO einen Layer zur Netzwerkprogrammierung, andere Bibliotheken implementieren (nicht immer, aber auch auf Basis von ASIO) Highlevel-Protokolle wie HTTP. Als Beispiel sei libcurl genannt (auch wenn das eine C-Bibliothek ist).

    Wenn es sowieso um Webservices geht, schau Dir mal das gSOAP Toolkit an. Die erzeugen zwar kein schönes C++, aber vollwertige Serializer/Deserializer für Deine Messages und Client- oder Server-Klassen für die Aufrufe.

    http://www.cs.fsu.edu/~engelen/soap.html


  • Administrator

    LordJaxom schrieb:

    Als Beispiel sei libcurl genannt (auch wenn das eine C-Bibliothek ist).

    Gibt auch einen C++ Wrapper dafür 😉
    http://curl.haxx.se/libcurl/cplusplus/

    Grüssli



  • Hallo,
    vielen Dank für die Antworten!

    ASIO klingt sehr interessant, allerdings ist's doch ganz schön aufwendig, einen einfachen HTTP-Client zu schreiben:
    http://www.boost.org/doc/libs/1_38_0/doc/html/boost_asio/example/http/client/sync_client.cpp

    Ich würde mir etwas objektorientierteres wünschen. Für Windows scheint es WinInet zu geben, da sieht sowas dann so aus:

    #include <wininet.h>
    
    HINTERNET inet = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    HINTERNET connection;
    HINTERNET request;
    unsigned long flags;
    unsigned long len;
    connection = InternetConnect(inet, TEXT(domainurl), INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
    flags = INTERNET_FLAG_PRAGMA_NOCACHE;
    request = HttpOpenRequest(connection, "POST", TEXT(scripturl), NULL, NULL, NULL, flags, 1);
    HttpSendRequest(request, "Content-Type: application/x-www-form-urlencoded", 47, (void*)stringtosend, strlen(stringtosend));
    std::stringstream CompleteBuffer;
    do {
        char antwortbuffer[10000];
        InternetReadFile(request, antwortbuffer, sizeof antwortbuffer, &len);
        antwortbuffer[len] = '\0';
        CompleteBuffer << antwortbuffer;
    } while(len);
    
    InternetCloseHandle(request);
    InternetCloseHandle(connection);
    InternetCloseHandle(inet);
    
    MessageBox(NULL, CompleteBuffer.str().c_str(), "Server Antwort", MB_OK);
    

    Gibt es so etwas auch für eine Linuxumgebung?

    Noch eine Frage: Ist die Menge der "Stanard-C++-Bibliotheken" fest definiert? Es hieß, dass ich mich nur in dem Pool der Standard-C++-Bibliotheken bedienen soll. Was wäre unter der Voraussetzung der "highest-level"-Weg, um meinen HTTP-Request zu senden? Über C-Sockets?

    Nochmals vielen Dank und viele Grüße
    bibe


Log in to reply