Eigene UDP Pakete erkennen
Benne
- java
0 Cruz0 seth_not@home0 Benne0 seth0 Benne2 Daniel Thoma0 Benne
Hallo,
wenn ich mit einem DatagramSocket ein DatagramPacket ins lokale Netz broadcaste und gleichzeitig auf diesem Port auf einkommene Pakete höre, bekomme ich auch das von mir gesendete Paket.
Für mich stellt sich die Frage, wie ich mein eigenes Paket am IP bzw. UDP Header erkennen kann.
Prinzipiell würde mir ja ausreichen, wenn ich die Absenderadresse eindeutig meinem eigenen Interface zuordnen kann. Mit den Methoden von InetAddress ist mir das aber bisher nicht gelungen.
Danke und Gruß,
Benne
Hallo Benne,
du kriegst das ankommende gebroadcastete Paket als DatagramPacket mittels der receive() Methode, soweit sind wir in sync oder?
Und wenn du jetzt DatagramPacket.getAddress() aufrufst, steht dann nicht deine eigene IP Adresse drin, woran du erkennen kannst, dass das Paket von dir selbst kommt? Ist in der Dokumentation nicht ganz eindeutig:
"Returns the IP address of the machine to which this datagram is being sent or from which the datagram was received"
Was denn nun? Die Zielmaschine oder die Quellmaschine? Jedenfalls hast du damit eine Chance.
Ansonsten gibt es ja auch noch DatagramPacket.getSocketAddress():
"Gets the SocketAddress (usually IP address + port number) of the remote host that this packet is being sent to or is coming from."
Wieder die selbe Unsicherheit, aber eine zweite Chance. ;)
Cruz
Hallo Cruz,
"Returns the IP address of the machine to which this datagram is being sent or from which the datagram was received"
Was denn nun? Die Zielmaschine oder die Quellmaschine?
Wenn man das paket empfängt, steht die des Senders drin, will man es verschicken, muss man die des Empfängers reinschreiben.
Das geht aus der Dokumentation von recieve() und send() hervor.
Grüße
Daniel
gudn tach!
Für mich stellt sich die Frage, wie ich mein eigenes Paket am IP bzw. UDP Header erkennen kann.
ich kenn mich da noch nicht so aus. aber vielleicht hilft's ja trotzdem auf irgendeine weise weiter: iirc sind die bytes 6 bis 11 (wenn man bei 0 und "vorne" im layer-2(?)-paket zu zaehlen beginnt) die mac-adresse des senders. diese bytes muesstest du also nur mit deiner mac-adresse vergleichen.
oder du vergleichst (auf aehnliche weise) die ip-adressen von dir und dem sender des udp-pakets.
prost
seth
Hallo,
oder du vergleichst (auf aehnliche weise) die ip-adressen von dir und dem sender des udp-pakets.
genau das hatte ich auch vor. Allerdings habe ich es bisher mit den Methoden von InetAddress einfach nicht geschafft und habe mir erhofft hier ein kleines, funktionierendes Code-Snipped präsentiert zu bekommen :)
Gruß,
Benne
gudn tach!
[...] Allerdings habe ich es bisher mit den Methoden von InetAddress einfach nicht geschafft
poste doch mal deinen bisherigen versuch.
ich kenne mich mit dem kram (DatagramSocket, DatagramPacket und InetAddress, naja und java insg. eigentlich auch) nicht aus, aber ist es nicht auch moeglich einfach byte-/bitweise auf das packet zuzugreifen?
oder wo ist jetzt eigentlich noch dein problem? kannst du die adresse aus dem udp-paket nicht extrahieren oder bekommst du deine eigene ip nicht heraus?
prost
seth
Hallo seth,
oder wo ist jetzt eigentlich noch dein problem? kannst du die adresse aus dem udp-paket nicht extrahieren oder bekommst du deine eigene ip nicht heraus?
genau das, ich bekomme meine eigene IP nicht heraus.
Wie ich heute erfahren habe, ist das ohne das JNI zu benutzen auch gar nicht möglich.
Gruß,
Benne
Hallo Benne,
Du empfängst doch die Pakete über ein DatagramSocket?
Das hat eine Methode getLocalAddress() mit der Du die IP bekommst, an die das Socket gebunden wurde.
Wenn Du dein DatagramPackage mit ds.recieve(p) empfangen hast, solltest Du also einfach mit p.getAddress().equals(ds.getLocalAddress()) prüfen können, ob das von der gleichen IP kommt.
Abgesehen davon bekommst Du alle Interfaces eines Rechners auch mit NetworkInterfaces.getNetworkInterfaces(). Da gibt es dann eine Methode getInetAddresses()
Grüße
Daniel
Hallo Daniel,
Du empfängst doch die Pakete über ein DatagramSocket?
Das hat eine Methode getLocalAddress() mit der Du die IP bekommst, an die das Socket gebunden wurde.
ich binde an 0.0.0.0 ;)
Abgesehen davon bekommst Du alle Interfaces eines Rechners auch mit NetworkInterfaces.getNetworkInterfaces(). Da gibt es dann eine Methode getInetAddresses()
danke, das ist es!
Gruß,
Benne