2014-02-26 10 views
5

hier um zu bestimmen, ist einfach Fall, wenn alle IP-Schnittstellen und spezielle UDP-Port-Bindung:Java, Datagrampacket empfangen, wie lokale IP-Schnittstelle

int bindPort = 5555; // example, udp port number 
DatagramSocket socket = new DatagramSocket(bindPort); 

byte[] receiveData = new byte[1500]; 
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 

... 

socket.receive(receivePacket); 

Wie kann ich wissen, auf welche IP-Schnittstelle I-Paket empfangen?

ich sehen kann, gibt es getSocketAddress():

Ruft die Socket (in der Regel der IP-Adresse + Port-Nummer) der Remote-Host, dass dieses Paket gesendet wird oder herkommt.

aber das gibt remote ip + port zurück. Ich würde gerne lokale IP kennen (lokaler Port ist 5555 in diesem Beispiel).

Ist es möglich mit Std. Java-Bibliotheken?

+0

Ich verstehe nicht, Sie kennen bereits den Port, seit Sie es übergeben. Die lokale IP-Adresse lautet 127.0.0.1. – m0skit0

+0

Ist die lokale IP-Adresse IMMER 127.0.0.1 nicht? – Rainbolt

+0

Sie haben recht mit Port, es ist offensichtlich. Aber die lokale Adresse kann beliebig sein, da ich an 0.0.0.0 gebunden habe. Hole es ? –

Antwort

1

Ich kenne dieses Problem. Um den Zweck zu verdeutlichen: Sie erhalten ein Paket über UDP (normalerweise irgendeine Art von Discovery-Implementierung) und möchten eine Antwort wie ("Sehr geehrter Kunde, bitte laden Sie die Datei von http://<wtf-is-my-ip>:8080/thefile.txt") zurück. Meine Maschine hat drei IPs: 127.0.0.1, 192.168.xx und 10.xxx und das Ziel ist herauszufinden, dass der entfernte Client das UDP-Paket an 192.168.xx gesendet hat und dass dies die IP sein muss, die auch für eine andere Verbindung funktioniert .

Vom weupnp project fand ich den folgenden Code, der nicht perfekt ist, aber für mich gearbeitet:

private InetAddress getOutboundAddress(SocketAddress remoteAddress) throws SocketException { 
     DatagramSocket sock = new DatagramSocket(); 
     // connect is needed to bind the socket and retrieve the local address 
     // later (it would return 0.0.0.0 otherwise) 
     sock.connect(remoteAddress); 

     final InetAddress localAddress = sock.getLocalAddress(); 

     sock.disconnect(); 
     sock.close(); 
     sock = null; 

     return localAddress; 
    } 

//DatagramPacket receivePacket; 
socket.receive(receivePacket); 
System.out.print("Local IP of this packet was: " + getOutboundAddress(receivePacket.getSocketAddress()).getHostAddress); 

Der Code könnte die falsche IP zurück, wenn Sie mehrere IP-Adressen im selben Netzwerk oder wegen einer fortgeschrittenen haben Routing-Konfiguration. Aber bisher ist es das Beste, was ich finden konnte und es reicht für die meisten Situationen.

+0

Sehr gute Idee. Vielen Dank. –

0

Sie können eine Kombination der Klassen NetworkInterface und InetAddress verwenden, um die Details Ihres Netzwerks zu erhalten.

NetworkInterface

InetAddress

+1

Wenn ich tcp und _ServerSocket_ class verwende, gibt es _getLocalSocketAddress() _, das genau das zurückgibt, was ich brauche. Aber mit udp konnte ich so etwas nicht finden. –