recvfrom nur von spezieller IP-Adresse



  • Hi,

    ich schreibe heute zum ersten Mal in dieses Forum. Also bitte nicht erschießen, wenn diese Frage im falschen Forum ist... 😃

    Also, ich wollte mal ein plattformunabhängiges Ping schreiben. Hierzu (oder zumindest zu teilbereichen davon) habe ich hier im Forum auch einiges gefunden.
    Ich wollte allerdings, daß es möglich ist, mehrere IP-Adressen anzugeben. Diese sollen dann in unterschiedlichen Threads gepingt werden. Nachdem ich das Problem mit mit der nicht-thread-fähigkeit von gethostbyaddr gelöst habe, stehe ich vor der Schwierigkeit bei der recvfrom-Funktion anzugeben von welchen IP-Adressen Nachrichten empfangen werden sollen. Wenn jeder Thread sendto und danach recvfrom aufruft, wollte ich eigentlich, daß recvfrom nur die Daten empfängt, die von dem Client kommen, an den Daten mit sendto gesendet wurden.

    Ich habe es mit bind und sontigem probiert, allerdings scheine ich nicht ganz damit zurecht zu kommen. Es werden immernoch von dem Thread der zuerst recvfrom aufruft, die Nachrichten empfangen, die zuerst ankommen. Egal von welchem PC.

    Nicht, daß ihr jetzt denkt, ich hätte hier gerne den dazugehörigen Source-Code. Es wäre nur echt cool, wenn mir einer von euch sagen könnte, ob ich mit bind überhaupt auf dem richtigen weg bin?

    Wenn ich bind benutze, kann ich dann trotzdem einen Socket zum Senden und zum Empfangen verwenden?

    Ich wäre für jede Hilfe dankbar...



  • SocketBeginner schrieb:

    [...]
    Ich habe es mit bind und sontigem probiert, allerdings scheine ich nicht ganz damit zurecht zu kommen. Es werden immernoch von dem Thread der zuerst recvfrom aufruft, die Nachrichten empfangen, die zuerst ankommen. Egal von welchem PC.
    [...]

    Mit bind bindest du die Socket an eine LOKALE Adresse ( IP ( z.B. ADDR_ANY ) + Port ), d.h. du musst das recvfrom in einem einzigen Thread laufen lassen, da die Socket alle Daten, die an diesen Port gesendet wurden empfängt ( da connectionlose, messageorientierte Socket ) und zwar ganz egal von wem sie gesendet wurden. Ansonsten wäre es völlig zufällig welcher recv-Thread von welcher Adresse empfängt ( was bei dir ja auch im Moment der Fall ist 😉 ).



  • Dieser Thread wurde von Moderator/in davie aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hi

    Ich verstehe nicht ganz dein Problem. Warum willst du überhaupt dass der Socket der das icmp-echo-request packet geschickt hat auch die reply bekommt ?

    Du kannst doch den Status anders verwalten. Für jeden ping den Status in eine geeignete Struktur schreiben. Dann baust du dir einen Lese-thread in dem du vom Socket liesst. Anhand der IP kannst du ja entscheiden ob es eine Antwort auf eine deiner Anfragen war, und wenn ja auf welche. Dann kannst du die entsprechende Struktur updaten. In diesem allgemeinen Lese-thread ist recvfrom aber nicht so gut. Ich würde es mit nem einfachen read() auf den Socket machen.
    Wenn du eine globale Liste o.ä. verwendest um die Statusinformationen zu speichern aber nicht vergessen mit nem Mutex o.ä. zu arbeiten.



  • Ob man Nachrichten von einem Client annimmt entscheidet man nicht bei einer rec()
    Da hast du den Connect schon angenommen und der Client sendet bereits anden Kernel.


Anmelden zum Antworten