TCP/IP Telegramm empfangen und ID auslesen und weiterversenden



  • Guten Tag Forum User der C++ Community,
    ich bin der Jochen (25, Krebs) und neu hier 🙂

    Ich Studiere momentan Elektrotechnik (c++ Grundlagen sind inne 🙂 ) und will für ein eigenes Studi-Projekt ein Programm schreiben das über TCP/IP Telegramme ausliest.
    Ich weis leider überhaupt nicht wie und wo ich da anfangen soll und zerbreche mir bereits schon den Kopf dran.
    Ersteinmal benötige ich doch bestimmt einen Header der die Lib's für die TCP/IP Kommunikation beinhaltet.
    Welche nutzt man denn dort bspw. unter Win XP oder Win7 ?
    Winsock sagt mir etwas aber dass war auch schon.

    Bringt es etwas die Geschichte unter C# oder VSBasic zu coden ggf. mit einem Framework?

    Für Ansätze oder bereits fertige offene Code Schnipsel wäre ich sehr dankbar!!

    Hier eine Beschreibung von meinem vorhaben:

    Ein PC (Client) an einem Switch sendet einem andern PC (Server) 24byte lange Telegramme mit einer eigenen ID über TCP/IP.

    Nun soll der Server die Telegramme anhand der ID identifizieren und diese an eine entsprechende IP bzw. Clienten senden.

    Z.B.: Das Telgegramm mit der ID 0xAAAE geht an Client1 (192.168.0.2) und ein anderes 0xAAAF geht an Client2 (192.168.0.3)

    Das ist alles für ein kleines Robbi Netzwerk, der Client sendet Befehle an den "Server" und der wiederum sendet die Befehle an den entsprechenden Roboter (Lego NXT 😃 )

    Also wie würde ich da am besten ran gehen um das Programm für den Server zu schreiben.

    Schematisch dachte ich mir das so:

    Telegramm-Switch-Programm:

    -> Empfange TCP/IP Telegramme -> lese/suche nach ID -> (Schleife wenn ID==A dann sende an PC1 wenn ID==B dann sende an PC2 ...)

    Für Ideen, Ansätze, Interesse an Beteiligungen an meinem Projekt, Hilfen jeglicher Art wäre ich sehr dankbar.

    Viele Grüße
    Jochen



  • Benutze doch Boost.Asio (http://www.boost.org/) oder POCO (http://pocoproject.org/).

    Simon

    Edit

    Bringt es etwas die Geschichte unter C# oder VSBasic zu coden ggf. mit einem Framework?

    Ja, das kann allerdings sehr interessant sein. Das .NET Framework hat eine umfassende Unterstützung für Networking (http://msdn.microsoft.com/en-us/library/system.net.aspx)



  • Hi Simon,

    ich schau mir das gerade mal an, sieht ja interessant aus vor allem das Poco.
    Das wäre ja schon einmal ein Ansatz. Nur wie ich programmiertechnisch die Telegramme zuordne ist mir unklar.

    Jochen

    Edit:

    Ok das mit .Net klingt auch sehr gut, ich habe mich leider noch nicht mit Visual C# .net beschäftigt - aber ich bin für alles offen 🙂

    Danke für die Info!



  • Die Telegramme musst Du selbst zusammensetzen, d.h. entweder Anfang und Länge in den Telegram Header oder Anfang und Ende eines Telegramms markieren.

    Edit
    Natürlich gehen auch Telegramme mit fixer Länge, falls keine Daten mit dynamischer Länger (z.B. strings) enthalten sind.

    Danach gemäss deiner Serialisierung die Daten in Bytes umwandeln, bzw. die Bytes in die Daten umwandeln (Deserialisierung).

    Simon



  • Danke!
    Die Telegramme werden ja bereits von einem anderen Programm an eine bestimmte IP Adresse versendet. Die haben immer laut Spezifikation von LegoNXT 25byte länge. Nur muss ich diese ja auffangen und anhand der ID zuordnen.
    Oder verwechsel ich gerade was? Natürlich müsste ich die ja Telegramme zwischenspeichern und weitersenden.

    Jochen



  • Hmm hat vielleicht jemand noch eine Idee?



  • Die TCP/IP unterstürtzung von sfml (http://www.sfml-dev.org/) ist sehr einfach. Zusätzlich wird das verschicken/senden von Daten vereinfacht (Im Stil der C++ Streams)
    Hier das Tutorial: http://www.sfml-dev.org/tutorials/1.6/network-sockets.php



  • vielen dank ich werde das mal nachverfolgen.

    könnt ihr vielleicht weitere Literatur empfehlen?

    jochen



  • ERLEDIGT!

    Für Personen die das gleiche Problem haben, hier meine Vorangehensweise:

    TCP Listener erstellt und Socket Stream in Byte-Array Buffer gschreiben.

    Neuen Buffer mit Messagelänge erstellt und mittels Array.Copy die Werte mit der Länge der Messagelänge reingeschrieben.

    Message in String umgewandelt und einen Substring erstellt der nur die MSG-ID enthält.

    Unötige Zeichen wie "-" habe ich dann mittels String.Replace (oder so) entfernt. Ergo saubere Message ID.

    Alternative hätte man wiede nen array.copy machen können und den Bytebereich mittels BitConverter und To Hex in Hex wandeln können.

    Hab dann eine Switchanweisung gemacht und die MSG-ID verglichen und entsprechend dem Case immer ne Anweisung ausgeführt die einen kleinen UDP Sender enthält.

    Falls man per TCP sendne will muss man jedenfalls einen Client erstellen und die Byte-Daten-Arrays übergeben samt IP/PORT.

    Viele Grüße
    Superkato


Anmelden zum Antworten