2015-09-01 132 views
1
一個DatagramSocket(UDP)的本地地址

我用Java實現與DatagramSocket類(UDP)DNS服務器和代碼如下:如何在Java中獲得

try (DatagramSocket socket = new DatagramSocket(new InetSocketAddress("0.0.0.0", 53))) { 
    DatagramPacket request = ... // Init Packet 
    socket.receive(request); 
    ... // Parse request, Resolve, then Generate reesponse 
    socket.send(response); 
} 

它工作在我的電腦和罰款大多數服務器(包括aws,linode等),但在具有雙以太網適配器的服務器上無法正常工作。

該服務器具有網絡配置:

auto lo 
iface lo inet loopback 

auto eth0 
iface eth0 inet static 
address 192.168.1.204 
netmask 255.255.255.0 

auto eth1 
iface eth1 inet static 
address 192.168.1.207 
netmask 255.255.255.0 

當我測試這個DNS,我得到:

# nslookup 
> server 192.168.1.207 
Default server: 192.168.1.207 
Address: 192.168.1.207#53 
> info.dev. 
;; reply from unexpected source: 192.168.1.204#53, expected 192.168.1.207#53 
;; reply from unexpected source: 192.168.1.204#53, expected 192.168.1.207#53 
;; reply from unexpected source: 192.168.1.204#53, expected 192.168.1.207#53 
;; connection timed out; no servers could be reached 
> 

這似乎收到的eth1(192.168.1.207)的數據包,但發送到eth0(192.168.1.204)。而且我的代碼不知道從哪個接口接收數據包。

try (DatagramSocket socket = new DatagramSocket(new InetSocketAddress("0.0.0.0", 53))) { 
    ... 
    socket.receive(request); // local socket address not known :-(
    ... 
    socket.send(response); // local socket address not known :-(
} 

套接字(TCP)可以做到這一點,但我不知道DatagramSocket(UDP)是否可以這樣做。

UPDATE-1:

綁定一個接口,而不是0.0.0.0,它工作正常。

UPDATE-2:

插座(TCP)可以得到的本地和遠程地址:

try (ServerSocket server = new ServerSocket(23)) { 
    try (Socket socket = server.accept()) { 
     System.out.println(socket.getLocalSocketAddress()); 
     System.out.println(socket.getRemoteSocketAddress()); 
    } 
} 
+1

'0.0.0.0'基本上是指「所有接口」,你不能將套接字綁定到一個接口嗎? –

+0

我不明白這個問題。該DatagramSocket的本地地址是0.0.0.0:53。您構建它時指定的那個。它用於回覆的接口由靜態IP路由表決定。不是通過這個代碼。不是一個編程問題:脫離主題。 – EJP

+0

@ AndersR.Bystrup綁定一個(例如192.168.1.207)即可。 – auntyellow

回答

2

該DatagramSocket的的本地地址是0.0.0.0:53。您構建它時指定的那個。它用於回覆的接口由靜態IP路由表決定。不是通過這個代碼。並且獲取DatagramSocket的本地地址,或者甚至是數據報的目標地址(您可以使用C但不是Java),如果這是一個問題,將無助於您解決此問題。

我的代碼不知道從哪個接口接收數據包。

正確。它不關心。它正在監聽所有IP地址。你告訴它這樣做。它只關心遠程地址,你沒有顯示,但顯然是正確的。

try (DatagramSocket socket = new DatagramSocket(new InetSocketAddress("0.0.0.0", 53))) { 

我不知道你爲什麼發佈了兩次。

這裏有一個靜態的IP路由問題。不是一個編程問題。