我用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());
}
}
'0.0.0.0'基本上是指「所有接口」,你不能將套接字綁定到一個接口嗎? –
我不明白這個問題。該DatagramSocket的本地地址是0.0.0.0:53。您構建它時指定的那個。它用於回覆的接口由靜態IP路由表決定。不是通過這個代碼。不是一個編程問題:脫離主題。 – EJP
@ AndersR.Bystrup綁定一個(例如192.168.1.207)即可。 – auntyellow