UDP empfangen, mehrere Progs an einem Port



  • Hallo,

    ich habe ein etwas größeres Problem und hoffe hier Hilfe zu finden.

    Ich versuche mit meiner Anwendung UDP Pakete, die ein Senderprogramm sendet, zu empfangen. Dieses Programm sendet stur UDP Pakete an/von Port 3525 an die Broadcast-Adresse 5.255.255.255. Einstellungsmöglichkeiten gibt es keine, außer dass ein Netzwerk-Adapter gewählt werden kann, von dem gesendet wird. Auch die 127.0.0.1 ist dabei.

    Meine Anwendung klappt soweit wunderbar, allerdings gibt es da 2 Probleme:
    1. Es geht nicht, wenn beide Programme auf demselben PC laufen. Vermutlich liegt es daran, dass beide auf denselben Port zugreifen?! Ich dachte, das ließe sich mit dem Loopback-Device 127.0.0.1 ändern?!

    2. Ich muss die IP-Adresse des Rechners, auf dem sich mein Programm befindet in den Adressraum 5...* legen.

    Das klingt auch alles soweit logisch, ich besitze jedoch eine Art Portsniffer, der trotz 192.* IP und Betrieb auf demselben PC alle Bytes korrekt anzeigt. Es muss also funktionieren. Leider ist dieser Sniffer nicht OpenSource.

    Wenn ich das mit meiner Anwendung probiere, empfange ich zwar auch etwas, aber es sind irgendwelche strubbeligen Daten die sich da im UDP Buffer befinden. Die sind 100%ig auch von dem Senderprogramm - denn wenn es geschlossen ist, warte ich vergebens auf Daten - aber sie sind nicht "sinnvoll".

    Kann mir jemand erklären, was ich falsch mache?

    Ich arbeite mit Winsocks und dem einfachen recvfrom. Gibt es evtl. bei der SOCKADDR_IN oder bei den SOCKET Parametern irgendwelche Optionen, die mir helfen?

    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    //RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY); Tut's auch nicht
    

    Danke & LG



  • backi schrieb:

    1. Es geht nicht, wenn beide Programme auf demselben PC laufen. Vermutlich liegt es daran, dass beide auf denselben Port zugreifen?! Ich dachte, das ließe sich mit dem Loopback-Device 127.0.0.1 ändern?!

    Soweit ich weiß landet ein Broadcast bei allen Geräten im Subnetz, aber nicht beim Absender?

    backi schrieb:

    2. Ich muss die IP-Adresse des Rechners, auf dem sich mein Programm befindet in den Adressraum 5...* legen.

    Welches Programm? Und warum muss die IP in diesem Adressraum liegen.



  • Hey,

    danke für deine Antwort. Ich habs inzwischen hinbekommen.

    Problem 1 lässt sich mit der Socket Option REUSE_ADDR lösen. Damit wird der Socket dann trotzdem an den Port gebunden, auch wenn er schon von einem anderen Programm genutzt wird.

    Problem 2 hab ich mit dem sagenumwobenen Promiscuous Mode und RAW Sockets hinbekommen. Quasi eigenen Packet Sniffer gebaut und hol mir alles aus dem Netzwerk, was ich brauche. Vielleicht nicht die Profi-Lösung, aber ein funktionierender Workaround.

    LG


Anmelden zum Antworten