Übertragungsprotokoll Auswahl



  • Die Idee mit JSON wäre für das eigene Protokoll gewesen. Könnte ja zum Beispiel so aussehen:

    //Client sendet
    { "method": "get", "type": "sql", "command": "checkAccData", "user": "Peter","pass": "1234" }
    
    //Server reagiert mit
    
    //unterscheide nach method
    //unterscheide nach type
    //Server sucht user in Datenbank und schaut welches Passwort er hat.
    //Server prüft ob Passwort gleich dem gesendetem Passwort ist. Wenn ja sende:
    {  "checkAccData": "true","errorcode": 0 }
    
    

    So hatte ich das gemeint. An dem Projekt arbeiten nur zwei Leute. Daher die Überlegung, ob es auf vielleicht einfacher ist das Protokoll selbst zu gestalten.
    Wenn du sagst HTTP wäre trotzdem besser, nehme ich das.



  • Was eigenes musst du selbst zusammen basteln. Http ist klar definiert und du kannst eine fertige Implementierung verwenden.



  • Genau. Ist zwar bissel mehr Schreibarbeit, aber somit auch ne Herausforderung. Und falls es irgendwo kracht, kenne ich meinen Code und finde schnell woran es liegt. Ich denke, dass dieser Weg noch einigermaßen akzeptabel ist und sich nicht gleich jeder Programmierer an den Kopf fasst.

    :smiling_face_with_open_mouth_cold_sweat:



  • @zhavok
    Ob Eigenentwicklung oder vorgefertigt: es ist immer die Frage was du erreichen willst und was deine Randbedingungen sind.
    Wenn du viel schnell von A nach B schaffen musst, sollte es natürlich ein Protokoll sein, was wenig Overhead hat, bzw. wo das Verhältnis zwischen Gesamtlänge einer Message und Inhalt der Message möglichst vorteilhaft ist. Wenn du aber nur dann und wann mal ne Message austauschst, ist die Performance mehr oder weniger egal und auch der Overhead ist vernachlässigbar.

    Wieviel Zeit kannst du dir nehmen?
    Glaubst du dass du mit einer Eigenentwicklung eines Protokolls deinen Horizont erweitern könntest?
    Transportierst du mehr Zahlen, oder mehr Strings?
    Wenn Zahlen, dann mehr ganzzahliges, oder Gleitkomma?

    Wenn du die ersten beiden Fragen mit "JA" beantwortest, solltest du dir selber was ausdenken, wenn nicht reicht auch eine vorgefertigte Lösung. 😉

    Ich für meinen Teil bastel mir gern eigene Dinge, wenns die Zeit erlaubt.



  • Ich würde es auch lieber selbst bauen. Wenn das Projekt jetzt fremde nutzen würde, dann greife ich natürlich lieber zu einem Standart. Aber da nur um mich und einen zweiten geht, denke ich reicht was eigenes. (Vorteil wäre nur noch, dass der Client gleich ne Lib wie cURL nutzen könnte). Bei beiden möglich muss ich dem Server erklären was genau er aus der Datenbank lesen soll bzw ob er anders reagieren soll. Beim Datentransfer hat natürlich HTTP schon alles fertig. Ich mache das bis jetzt immer so, dass ich dem Client die Größe der Datei schicke und dann in gleichmäßig großen Paketen schicke. Der Client wartet dabei bis die zuvor geschickte Größe erreicht wurde. Ich denke hier könnte man dann noch eine Prüfsumme mit ins Spiel bringen.

    Achso und ich habe alle Zeit der Welt. 😀



  • @zhavok sagte in Übertragungsprotokoll Auswahl:

    Achso und ich habe alle Zeit der Welt. 😀

    Das ist immer gut 😉

    Dein Dateipaket-Transfer-Prokoll klingt jetzt auch nicht nach viel Arbeit.

    • Initial die DateiGröße verschicken
    • warten auf Bestätigung durch Client ( "bin empfangsbereit" )
    • Paket verschicken
    • auf Bestätigung durch Client warten, nächsten Paket schicken
    • etc.
      Die Handshakevariante verhindert, dass du die Leitung überlastet.

    Ein Tag Arbeit würde ich sagen ( leicht handhabbares Socket-Framework vorausgesetzt ) 😉



  • Der Vorschlag ist gut. Bis jetzt hab ich mir das auch nur zusammen gereimt und dabei ist die Variante entstanden die ich geschrieben habe. Aber ich werde deine Idee ab jetzt für sowas anwenden 👍🏻



  • @zhavok sagte in Übertragungsprotokoll Auswahl:

    Ich denke, dass dieser Weg noch einigermaßen akzeptabel ist und sich nicht gleich jeder Programmierer an den Kopf fasst.

    An den Kopf fassen nicht, wir sind das schon gewohnt. NIH ist gerade bei Anfängern stark verbreitet.

    Wenn das ganze für Produktiv-Code ist, dann würde ich vorschlagen auf ein bestehendes Protokoll zurückzugreifen. Der Vorteil ist einfach dass du fertige Implementierungen wie z.B. libcurl hast. Die funktionieren. Eigenen Netzwerkcode schreiben ist was was man gerade als Anfänger eher vermeiden sollte, weil man da schnell Fehler einbauen kann. Die Socket Funktionen haben nämlich so einige Eigenheiten die zwar grundsätzlich alle irgendwo dokumentiert sind, die man aber als Anfänger schnell übersieht. Bzw. nicht weiss wo man die entsprechenden Infos suchen muss. Bzw. weil man falsche Annahmen trifft, und übersieht dass die Doku der Funktionen bestimmte Dinge von denen man ausgeht gar nicht garantiert. Dabei sind auch Fehler möglich die man später nicht mehr ohne Protokolländerung beheben kann. Was dann besonders lästig ist.

    Und als erfahrener Entwickler schreibt man (hoffentlich) auch nur dann Netzwerkcode wenn es wirklich nötig ist/wirklich viel bringen würde. Weil man (hoffentlich) irgendwann akzeptiert dass es keinen Sinn macht immer alles selbst zu schreiben.



  • @zhavok
    Wenn du tatsächlich nur Dateien verschicken willst, brauchst du auch nicht zu sehr auf den Overhead achten, da den Großteil des Datenaufkommens tatsächlich die eigentlichen Datei-Pakete darstellen werden. Bedenke aber, dass du hier wohl kein Token-Protokoll ( also z.B. kommasepariert ) nutzen kannst, da in dem eigentliche Datenpaket (binäre Datei), theoretisch jedes Steuerzeichen vorkommen kann, was dann theoretisch zu Fehlern beim Parsen führen kann.



  • @hustbaer sagte in Übertragungsprotokoll Auswahl:

    Eigenen Netzwerkcode schreiben ist was was man gerade als Anfänger eher vermeiden sollte, weil man da schnell Fehler einbauen kann.

    Das hängt davon ab wie sehr man noch Anfänger ist. Das Problem ist halt, dass viele gar nicht erkennen wann sie sich Socket-Programmierung zumuten können und daraus entstehen dann Programmierer ( ich sage bewusst nicht: Entwickler ), die eigentlich nur Interfaces von irgendwelchen Bibliotheken jonglieren können, aber noch nie ne Liste, ne Map oder ein Socketframework selber gebaut haben. Und das ist echt schade.

    Daher sage ich: Wer die Zeit hat, kann sich ruhig mal selber einarbeiten, auch in Sockets. Wenn es ein berufliches Projekt mit einem engen Zeitrahmen ist, sollte man natürlich existierende Bibliotheken nutzen, oder bereits vorliegenden firmeninternen Code ( wenn der taugt ).



  • Verzeiht mir falls ich jetzt die Begriffe durcheinander bringe, aber ich würde sagen Boost.Asio ist mein Socket Framework. Bin allgemein ein Freund der Boost Bibliothek 😄. Mit Asio hab ich jetzt seit ca 5 Monaten zu tun. Ich habe damit schon minimalistische Server gebaut die dazu dienen Dateien zu versenden und jeden Tag genutzt werden. Da war mein Protokoll noch wesentlich katastrophaler, aber es läuft bis heute. Ich würde definitiv nicht sagen, dass ich Ahnung von Socket - Programmierung habe, aber alles was ich bis jetzt damit gemacht habe, läuft wie es soll. Asio war zumindest bis jetzt immer gut zu mir ^^.



  • @zhavok
    In dem Fall würde ich boost::asio auch dem Fall verwenden, wenn du dich damit wohlfühlst. Aber es schadet nicht, dich für die Zukunft im Bereich Sockets noch weiterzubilden. 😉



  • Definitiv. Besonders weil mich das Thema Netzwerkprogrammierung auch sehr interessiert. Ich wollte am Anfang mir mal die Winsocks anschauen, habe dann allerdings doch auf anraten Asio genommenen (plattformübergreifend usw)



  • @zhavok
    Ja also so extrem sind die Unterschiede zwischen Posix und WinSock auch wieder nicht. Ich sag mal so: wenn du dir selbst eine Socketklasse für Linux und Windows bauen wollen würdest, wäre das gut möglich. Die Funktionen sind aber beiden ungefähr die gleichen.

    setsockopt, bind, connect, listen, accept, send, recv, select/select

    Das würdest du schon geschultert kriegen 😉 Plus: es gibt tonnenweise Beispielquelltext im Netz und auch hier auf der Seite hast du da genug Unterstützung.



  • @it0101 sagte in Übertragungsprotokoll Auswahl:

    Ja also so extrem sind die Unterschiede zwischen Posix und WinSock auch wieder nicht. Ich sag mal so: wenn du dir selbst eine Socketklasse für Linux und Windows bauen wollen würdest, wäre das gut möglich. Die Funktionen sind aber beiden ungefähr die gleichen.

    Nur ist die reduzierung auf berkeley sockets nicht ratsam auf beiden Platformen. IOCP auf Windows ist ein wichtiger Mechanismus, wenn man es "richtig machen will".
    Und auf linux epoll.



  • @It0101 Posex macht mehr Spaß ....



  • Vielen Dank für eure vielen Antworten!

    Ich werde mich sobald ich privat etwas mehr Luft habe mal mit den Sockets auseinander setzten. Ist sicher spannend. Für das Projekt was ich jetzt mach, schau ich mit nochmal an, was es für fertige HTTPS Libs gibt und wie gut ich die implementieren kann. Falls ich nicht so richtig damit warm werde, schreib ich mein eigenes Protokoll. Die Zeit lässt es auf jeden Fall zu. Und die Idee von @It0101 mit dem Dateitransfer finde ich auch gut. Falls ich jetzt eine Lib finde, so werde ich sicher trotzdem einen Fall haben wo ich das mal anwenden kann, ansonsten nehm ich das gleich für mein Projekt hier.

    Also nochmal Danke an alle 🙂



  • @swordfish sagte in Übertragungsprotokoll Auswahl:

    @It0101 Posex macht mehr Spaß ....

    Gebe ich dir recht. Irgendwie liegt mir das auch mehr, aber in aller Regel ist das Betriebssystem vorgegeben und man hat nicht unbedingt die freie Wahl 😉

    @5cript sagte in Übertragungsprotokoll Auswahl:

    @it0101 sagte in Übertragungsprotokoll Auswahl:

    Ja also so extrem sind die Unterschiede zwischen Posix und WinSock auch wieder nicht. Ich sag mal so: wenn du dir selbst eine Socketklasse für Linux und Windows bauen wollen würdest, wäre das gut möglich. Die Funktionen sind aber beiden ungefähr die gleichen.

    Nur ist die reduzierung auf berkeley sockets nicht ratsam auf beiden Platformen. IOCP auf Windows ist ein wichtiger Mechanismus, wenn man es "richtig machen will".
    Und auf linux epoll.

    Ich denke am Anfang will man es überhaupt erstmal machen. In der Hinsicht sind Sockets vergleichbar mit Sex. Die High-Performance-Lösungen kommen dann später :face_with_stuck-out_tongue:



  • @it0101 sagte in Übertragungsprotokoll Auswahl:

    @swordfish sagte in Übertragungsprotokoll Auswahl:

    @It0101 Posex macht mehr Spaß ....

    Gebe ich dir recht. Irgendwie liegt mir das auch mehr, aber in aller Regel ist das Betriebssystem vorgegeben und man hat nicht unbedingt die freie Wahl 😉

    *roflmao*



  • Eine Sache ist mir noch aufgefallen. Wenn der Server den private Key läd, so gibt es bei Boost die Möglichkeit diesen mit einem Passwort zu verschlüsseln.
    Es geht um die get_password() Methode. (Hier nochmal der Link: https://www.boost.org/doc/libs/1_67_0/doc/html/boost_asio/example/cpp03/ssl/server.cpp). Ich hätte für das Passwort jetzt eine Zufallszahl mit SHA-512 gehasht. Jedoch bin ich mir nicht sicher ob das schlau ist. Ihr habt mir hier in dem Thread ja schon einmal gezeigt, wie unsicher manches sein kann, was ich als sicher eingeschätzt hätte :smiling_face_with_open_mouth_cold_sweat:


Anmelden zum Antworten