Sockets unter C++/Linux

  • Hi,

    in Anlehnung an meinen früheren Thread möchte ich nun ein paar Fragen posten, die zwar immer noch damit zu tun haben, aber jetzt schon etwas konkreter sind.

    Punkt 1: Wie kann ich (syntaktisch) in C++ einen Socket eröffnen, der mit einem DHCP Server kommunizieren kann?

    Punkt 2: Welche Parameter (mir fällt kein besseres wort ein, es ist ja auch noch früh) hat der Socket, welche braucht der DHCP Server und wie kann ich dem (wiederum: es geht mir nur um die Syntax, die RFC's mit den erläuterten Optionen habe ich schon entdeckt) eigene Optionen schicken?

    Punkt 3: Danke bereits im voraus, ich bin optimistisch, dass sich jemand findet, der mir helfen kann.

    MfG
    Philipp
    http://www.informatik-forum.at/showthread.php?t=19803

    Philipp function beer no well without!
    -----------------------------------
    I was elected to LEAD, not to READ!

  • Zitat von Paladin_FRW

    Punkt 1: Wie kann ich (syntaktisch) in C++ einen Socket eröffnen, der mit einem DHCP Server kommunizieren kann?


    Ich kenn mich zwar mit DHCP nicht ganz so gut aus, aber ich denke, dass das wahrscheinlich mit RAW sockets gehen sollte. Siehe dazu die manpage packet(7).

    Zitat von Paladin_FRW

    Punkt 2: Welche Parameter (mir fällt kein besseres wort ein, es ist ja auch noch früh) hat der Socket, welche braucht der DHCP Server und wie kann ich dem (wiederum: es geht mir nur um die Syntax, die RFC's mit den erläuterten Optionen habe ich schon entdeckt) eigene Optionen schicken?


    Siehe oben.

    Aber da du ja das ganze in C++ implementierst, empfehle ich dir für das ganze socken-zeuch die ACE Library: http://www.cs.wustl.edu/~schmidt/ACE.html

    Adaptive Common Environment ist eine geniale Middleware, die dir sehr viel Arbeit abnehmen wird.

    Zitat von Paladin_FRW

    Punkt 3: Danke bereits im voraus, ich bin optimistisch, dass sich jemand findet, der mir helfen kann.


    Natürli ;)

  • So, ich hab mir das jetzt angesehn, ist eigentlich total cool und wäre die perfekte lösung für mich, wenn das ganze nicht für eine GROSSE Firma wäre, die das produkt, für das ich dieses Plug-In schreiben soll, im endeffekt verkaufen will.

    Und nachdem dieses ACE open-source ist (Was ja durchaus förderungswürdig ist, versteht mich nicht falsch!), könnte es da unter umständen probleme geben. deswegen habe ich von meinem Boss die direktive bekommen, alles, nur keine open-source gschichtln zu verwenden, weil das nur schwierigkeiten macht.

    Tja, also bin ich leider momentan auf demselben Stand wie vorher, nur ein kleines bisschen deprimierter.

    Philipp function beer no well without!
    -----------------------------------
    I was elected to LEAD, not to READ!

  • <sarkasmus on>
    womit compilierst denn dein nettes programm?
    der gcc is naemlich auch open source... :shinner:
    <sarkasmus off>

    und wenn ich mir das hier so durchlese seh ich eigentlich kein problem... oder?

    "You can use ACE+TAO+CIAO in proprietary software and are under no obligation to redistribute any of your source code that is built using ACE+TAO+CIAO. Note, however, that you may not do anything to the ACE+TAO+CIAO code, such as copyrighting it yourself or claiming authorship of the ACE+TAO+CIAO code, that will prevent ACE+TAO+CIAO from being distributed freely using an open-source development model. You needn't inform anyone that you're using ACE+TAO+CIAO in your software, though we encourage you to let us know so we can promote your project in the ACE+TAO+CIAO success stories.."

    lg
    segfault

    even newton had his best ideas on an apple...

  • Zitat von Paladin_FRW


    Punkt 1: Wie kann ich (syntaktisch) in C++ einen Socket eröffnen, der mit einem DHCP Server kommunizieren kann?

    gar nicht. c++ kennt kein konzept namens socket. das ist systemabhaengig.

    du hast hier mehrere moeglichkeiten unter linux.

    1. verwenden der posix systemcalls (man socket(2), accept(2), bind(2), connect(2), ...)
    2. verwenden einer c++ klassenbibliothek fuer netzwerkkommunikation (sock++, ACE, ...)

    wie der konkrete code ausschaut haengt natuerlich davon ab wie du dich entscheidest.

    Zitat von Paladin_FRW


    Punkt 2: Welche Parameter (mir fällt kein besseres wort ein, es ist ja auch noch früh) hat der Socket, welche braucht der DHCP Server und wie kann ich dem (wiederum: es geht mir nur um die Syntax, die RFC's mit den erläuterten Optionen habe ich schon entdeckt) eigene Optionen schicken?

    tja, ebenfalls abhaengig. generell laeuft die sache am client so ab:

    du schickst deine anfrage ueber einen udp datagram socket an port 67 der broadcast addresse deines netzwerks.

    du bindest einen udp datagram socket auf port 68 und wartest auf die antwort.

    Zitat von Paladin_FRW


    Ich kenn mich zwar mit DHCP nicht ganz so gut aus, aber ich denke, dass das wahrscheinlich mit RAW sockets gehen sollte.

    nein. empfangene udp oder tcp pakete werden nie an raw sockets uebergeben.
    falls du raw sockets mit dem linux SOCK_PACKET interface verwechselst so wuerdest du mit kanonen auf spatzen schiessen weil du damit auf den data link layer zugreifst.
    etwas low level fuer so eine applikation.

    ein bisschen beispielcode fuer die socket api hab ich dir hier zusammen kopiert (das ist nur ein schnell zusammengestueckeltes snippet aus ein paar sourcen von mir und deshalb nicht vollstaendig und auch nicht compiliert :). darin wird ein udp socket erstellt und auf port 68 gebunden. nun koenntest du von diesem socket lesen.

    den c code in schoene c++ klassen zu giessen obliegt dir

  • Dir sollte auch bewußt sein was blocking/non blocking/synchrone/asynchrone usw. sockets sind.
    Bei UDP auch die Eigenheiten desselben unbedingt beachten.
    (falsche packet Reihenfolge möglich, unreliable, etc)

    Sprich: Man kriegt recht rasch was scheinbar funktionieredes zusammen, ohne großartig Ahnung von den Konzepten/Details zu haben.
    Das rächt sich meist bald, z.B
    wenn man vom LAN ins Real-Net wechselt, oder das Ding gar für 100'erte User/Clients/Verbindugnen/etc funktionieren soll, dann kanns lustig/challenging werden bzw plötzlich unreproduzierbare Fehler/Probleme geben.
    Da liegt wird der Teufel extremst im Detail.
    Testen ist sehr schwierig, schlechte Verbindungen lassen sich z.B nur schwer simulieren.

    Insoferne zahlen sich da "battle-getestete" Libraries aus.
    Meine Empfehlung: entweder *wirklich* ausführlich mit dem Thema beschäftigen oder gute Libs verwenden.

    Jedenfalls viel Spaß :D

    Mfg, LB


    Trading for a living [equities,futures,forex]

  • Zitat von Paladin_FRW

    So, ich hab mir das jetzt angesehn, ist eigentlich total cool und wäre die perfekte lösung für mich, wenn das ganze nicht für eine GROSSE Firma wäre, die das produkt, für das ich dieses Plug-In schreiben soll, im endeffekt verkaufen will.


    Du kannst für keine grossen Firma arbeiten, wenn sie dich Plugins schreiben lässt, bei der du keine Helperlibraries verwenden darfst. Glaub mir, ich kenn den Unterschied zwischen kleinen Firmen und grossen Firmen, da ich schon für beide Gattungen gearbeitet habe ;-).

    Zitat von Paladin_FRW

    Und nachdem dieses ACE open-source ist (Was ja durchaus förderungswürdig ist, versteht mich nicht falsch!), könnte es da unter umständen probleme geben. deswegen habe ich von meinem Boss die direktive bekommen, alles, nur keine open-source gschichtln zu verwenden, weil das nur schwierigkeiten macht.


    Sag deinem Boss, dass er absolut keine Ahnung hat. Ich kenne ACE von meiner Arbeit bei Siemens. Und die nenne ich eine grosse Firma. Und die verwenden natürlich (so wie jede normale Firma auf dieser Erde) Open Source Lösungen.

    Sieh dir http://www.cs.wustl.edu/~schmidt/ACE-copying.html an, und du wirst erkennen, dass es ein sehr laxes Copyright hat.

  • Zitat von amok

    nein. empfangene udp oder tcp pakete werden nie an raw sockets uebergeben.
    falls du raw sockets mit dem linux SOCK_PACKET interface verwechselst so wuerdest du mit kanonen auf spatzen schiessen weil du damit auf den data link layer zugreifst.
    etwas low level fuer so eine applikation.


    Ach ja, bootp rennt über udp. Hab ich falsch in Erinnerung gehabt.

  • Hallo

    Ich greife diesen Thread mal auf.

    Eine Server-Applikation in C++ soll auf einem TCP-Socket Strings entgegennehmen, intern auswerten, mit Strings antworten.

    Die Gegenseite wird ein Java-Applet sein.

    ACE scheint das zwar "auch" zu können - wenn ich das richtig dort gelesen habe - aber es erscheint mir einwenig überdimensioniert zu sein hierfür.

    Kennt jemand eine andere Möglichkeit, zuverlässig TCP-Sockets in C++ einzubinden ?

    Das Programm soll unter Linux laufen.

    Ich danke euch.

    Gruß,
    Benja

  • Zitat


    Kennt jemand eine andere Möglichkeit, zuverlässig TCP-Sockets in C++ einzubinden ?
    Das Programm soll unter Linux laufen.


    Klar, selbst ausprogramieren ;)
    Wie zuverlässig das dann läuft, hängt einzig und alleine von dir ab ;)

    hier z.B ein sehr einfaches Beispiel ...


    Trading for a living [equities,futures,forex]

  • ich sehe dabei das problem, daß ich fürchte, doch irgendwelche fehler einzubauen.
    ich habe zwar guten durchblick in java aber in c++ bin ich blutiger anfänger

  • Hmmpf, dann kannst eigentlich gleich aufhören zu Programmieren ;)
    Denn da macht man eigentlich immer Fehler, und aus Fehlern lernt man sehr gut. Ganz besonders bei einer neuen Programmiersprache. Unabhänig davon, ob man jetzt sockets programmiert oeder nicht.
    Naja, ein wenig überzeichnet, aber die Message dürfte klar sein ...

    Sich an einer recht kryptischen API mit einer neuen Programmiersprache zu versuchen ist allerdings schon recht heftig.
    Macht die Fehlersuche nicht einfacher.
    Insoferne ist eine leicht verständliche und gut getestete socket lib empfehlenswert.
    1000% ernst gemeint war "sockets selbst ausprogrammieren" eh nicht. Ist halt eine Möglichkeit :D
    Mehr war ned gefragt ;)

    Was du vermutlich suchst ist etwas "lightweightigeres" als ACE ... Weiß da leider nix.
    Kenne ACE nicht, "nur" das Qt Framework , das würd ich auch nicht als lightweigt bezeichnen.

    Mfg, LB


    Trading for a living [equities,futures,forex]

  • also, es soll da irgendwo im netz ne socket++ api geben. zu der funktionieren aber alle links die mir google ausspuckt nicht.

    aber das tutorial das du verlinkt ist schonmal n guter anfang. leider klappt das unter cygwin nicht (z.z. muß ich hier unter win entwickeln...)

    ma guckn wie ich da weitermache.
    danke schonmal !

  • das ist mir jetzt hochgradig peinlich - ich hab immer nur den link zur uni verginia gekriegt und einen zu ner FH in Deutschland. Beide Links gingen nicht.

    Danke !

    Mal sehen, ob mir das weiterhilft !

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!