2014-02-26 382 views
5

綁定到所有IP接口和特定UDP端口時,下面是簡單的例子:的Java,DatagramPacket的接收,如何確定本地IP接口

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); 

我怎麼知道我上接收數據包的IP接口?

我可以看到有getSocketAddress()

獲取的SocketAddress該包被髮送到或來自的 遠程主機(通常是IP地址+端口號)。

但是,它返回遠程ip +端口。我想知道本地ip(本例中是本地端口是5555)。

它是可能與標準。 Java庫?

+0

我不明白,你已經知道端口,因爲你通過它。本地IP地址是127.0.0.1。 – m0skit0

+0

是不是本地IP地址ALWAYS 127.0.0.1? – Rainbolt

+0

你是對的港口,這是顯而易見的。但本地地址可以是任何,因爲我綁定到0.0.0.0。得到它 ? –

回答

1

我知道這個問題。爲了說明這一點的目的:你通過UDP收到一個數據包(通常是某種發現實現)並且想返回一個類似於「(親愛的客戶端,請從http://<wtf-is-my-ip>:8080/thefile.txt下載文件」)。我的機器有三個IP:127.0.0.1,192.168.xx和10.xxx,目的是要發現遠程客戶端將UDP數據包發送到192.168.xx,並且這必須是IP,它也可以用於其他連接。

weupnp project我發現下面的代碼,這是不完美的,但爲我工作:

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); 

的代碼,如果你有,因爲一些先進的相同網絡或多個IP地址可能會返回錯誤的IP路由配置。但到目前爲止,這是我能找到的最好的,在大多數情況下都足夠了。

+0

非常好的主意。謝謝。 –

0

您可以使用NetworkInterfaceInetAddress類的組合來獲取網絡的詳細信息。

NetworkInterface

InetAddress

+1

如果我使用tcp和_ServerSocket_類,則存在_getLocalSocketAddress()_,它正是我所需要的。但是用udp,我找不到那樣的東西。 –