Hallo,
vor einer Weile hatte ich ja schonmal ein paar Fragen zum Thema Sockets gestellt. Die liessen sich alle auf wundersame Weise lösen, doch nun stehe ich vorm nächsten Problem. Das Tool dient (zur Erinnerung) dem Steuern des Routers der TK Eumex 620 Lan unter Linux.
Vorgeschichte:
Man kann den Router der Anlage mit bestimmten Packeten Starten und Stoppen und somit verhindern das sich die Anlage ungewollt einwählt. Dies geht aber nur wenn kein anderer Rechner, z.B. der Win Rechner meines Vaters hochgefahren ist. Denn die Software "Home Capi Control" die zur Anlage gehört, meldet sich bei der Anlage an und ich habe erst vor kurzem herausgefunden wie die Authentifizierung funktioniert. Nun möchte ich natürlich das die Authentifizierung auch von meinem Tool simuliert wird.
Problem: Normalerweise antwortet die Anlage in einem Broadcast wenn KEIN anderer Rechner sich an der Anlage angemeldet hat. Das sieht dann z.B. so aus: Ich (192.168.69.7) sende ein Packet mit einer Routerstatusabfrage und bekomme als Antwort von der Anlage (192.168.69.254) einen Broadcast (192.168.69.255) mit der nötigen Routerinformation (..ist gestartet/..ist gestoppt..).
WENN sich ein Rechner an der Anlage angemeldet hat antwortet die Anlage DIREKT auf die IP des anmeldenten Rechners. Also kein Broadcast an 192.168.69.255 sondern eine direkte Antwort an 192.168.69.7.
Das Empfangen von Daten als Broadcast klappt ohne Probleme ( recvfrom() ). Die Anlage sendet die Antworten an alle Anfragen an Port 9997. Zum Empfangen der Broadcasts an Port 9997 muss ich nichteinmal den Socket auf listen setzen. Alle anderen Packete, also die direkt beantworteten kommen bei mir aber nicht an. Stattdessen antwortet der Kernel mit einem ICMP (Destination unrechable) an die Anlage. Das wiederum liegt ja mit hoher Wahrscheinlichkeit daran das ja der Port 9997 nicht offen im Sinne von listen ist. Wenn ich ihn aber auf listen setzen will erhalten ich ein "Operation not supported!". Was mache ich falsch? Wie kann ich die Daten die für meine IP bestimmt sind denn dann empfangen?
Freunlich grüßend, Martin
PS: Entschuldigt bitte den Traffic und den Spaghetticode... :)