在 linux (Ubuntu 18.04) 上设置 java 中编写的 DHCP 服务器时出现问题
Problems setting up DCHP server written in java on linux (Ubuntu 18.04)
我是 linux 的新手,也是网络新手,所以我可能在这个过程中犯了一些愚蠢的错误。
This 是我正在尝试设置的“网络”的当前“拓扑”。
所以,我在 linux 机器上设置 DHCP 服务器,据我所知,DHCP 是这样工作的(从服务器的角度来看).. 它接收客户端广播的 DHCPDISCOVER 然后它提供一个客户端也通过广播从分配的“池”(DHCPOFFER)中获取地址,然后客户端请求地址(DHCPREQUEST),最后服务器确认(如果出现错误,则为 DHCPACK 或 NACK)。目前我停留在 DHCPOFFER 步骤,因为当我将 linux 笔记本电脑(服务器)与我的 windows 笔记本电脑(客户端)连接时,它收到 DHCPDISCOVER 并在尝试广播 DHCPOFFER 时抛出异常。
我目前正在为网络使用这个 configuration,但到目前为止我已经尝试了多种变体
....DHCPMessage.BROADCAST_ADDR = InetAddress.getByName("255.255.255.255")....
....DHCPMessage.CLIENT_PORT = 68....
try {
byte[] data = back.msgToByteArr();
socket.setBroadcast(true);
var pack = new DatagramPacket(data, data.length,
DHCPMessage.BROADCAST_ADDR, DHCPMessage.CLIENT_PORT);
var arr = new byte[]{1};
var pack1 = new DatagramPacket(arr, arr.length,
DHCPMessage.BROADCAST_ADDR, DHCPMessage.CLIENT_PORT);
var pack2 = new DatagramPacket(arr, arr.length,
InetAddress.getByName("192.168.0.255"), DHCPMessage.CLIENT_PORT);
// after next line "java.io.IOException: Network is unreachable" is raised
// regardless of trying to send pack, pack1 or pack2 (or many other variations I've tried so far)
socket.send(pack2);
} catch (IOException e) {
return;
}
现在,这些只是我在成功收到 DHCPDISCOVER
后尝试发送的最后几个
pack <<-- the real DHCPOFFER message,
pack1 <<-- one of other attempts I've made, with just one byte sending
pack2 <<-- another attempt where I tried to broadcast keeping in mind the mask
另一件值得一提的事情是,一旦我在服务器笔记本电脑上打开 wifi(现在 eth 和 wifi 都已启动),DHCPOFFER 就会通过,但现在我再也没有从客户端收到 DHCPREQUEST,它卡住了关于 DHCPDISCOVER / DHCPOFFER 循环几次。
最后一件事是当服务器笔记本电脑上的 wifi 打开时,当我连接到我的 phone 时,整个通信通过 DHCPDISCOVER->DHCSPOFFER->DHCPREQUEST->DHCPACK(此时我停止在我的 phone 上访问互联网,但我猜这是因为分配的私有 IP 不适合 public 域)。这对我来说是最不重要的事情,因为我想让以太网连接网络工作,而不是 wifi 网络,但也许它包含一些重要信息。
好吧...虽然我仍然不能 100% 解释为什么广播会抛出上述异常,但是! 我设法找到了使一切正常运行的方法。事实证明,不需要更改代码
but rather the setup of the network on linux itself.
如果像我这样倒霉的人偶然发现类似的东西,我会发布我是如何修复它的。此外,肯定有一些知识渊博的人在那里,他们中的一些人可能会花时间解释发生了什么。
我的猜测:(请记住,这只是一个猜测)服务器笔记本电脑无法在网络上进行通信并且正在搜索 IP 本身 -(从另一个 DHCP 读取)所以当它是自动的分配了一个地址,该地址不适合所需的网络,因此问题出在网络设置(可能传播到套接字)而不是代码本身(或接收部分 - 255.255.255.255 BROADCAST)。
我是 linux 的新手,也是网络新手,所以我可能在这个过程中犯了一些愚蠢的错误。
This 是我正在尝试设置的“网络”的当前“拓扑”。
所以,我在 linux 机器上设置 DHCP 服务器,据我所知,DHCP 是这样工作的(从服务器的角度来看).. 它接收客户端广播的 DHCPDISCOVER 然后它提供一个客户端也通过广播从分配的“池”(DHCPOFFER)中获取地址,然后客户端请求地址(DHCPREQUEST),最后服务器确认(如果出现错误,则为 DHCPACK 或 NACK)。目前我停留在 DHCPOFFER 步骤,因为当我将 linux 笔记本电脑(服务器)与我的 windows 笔记本电脑(客户端)连接时,它收到 DHCPDISCOVER 并在尝试广播 DHCPOFFER 时抛出异常。
我目前正在为网络使用这个 configuration,但到目前为止我已经尝试了多种变体
....DHCPMessage.BROADCAST_ADDR = InetAddress.getByName("255.255.255.255")....
....DHCPMessage.CLIENT_PORT = 68....
try {
byte[] data = back.msgToByteArr();
socket.setBroadcast(true);
var pack = new DatagramPacket(data, data.length,
DHCPMessage.BROADCAST_ADDR, DHCPMessage.CLIENT_PORT);
var arr = new byte[]{1};
var pack1 = new DatagramPacket(arr, arr.length,
DHCPMessage.BROADCAST_ADDR, DHCPMessage.CLIENT_PORT);
var pack2 = new DatagramPacket(arr, arr.length,
InetAddress.getByName("192.168.0.255"), DHCPMessage.CLIENT_PORT);
// after next line "java.io.IOException: Network is unreachable" is raised
// regardless of trying to send pack, pack1 or pack2 (or many other variations I've tried so far)
socket.send(pack2);
} catch (IOException e) {
return;
}
现在,这些只是我在成功收到 DHCPDISCOVER
后尝试发送的最后几个pack <<-- the real DHCPOFFER message,
pack1 <<-- one of other attempts I've made, with just one byte sending
pack2 <<-- another attempt where I tried to broadcast keeping in mind the mask
另一件值得一提的事情是,一旦我在服务器笔记本电脑上打开 wifi(现在 eth 和 wifi 都已启动),DHCPOFFER 就会通过,但现在我再也没有从客户端收到 DHCPREQUEST,它卡住了关于 DHCPDISCOVER / DHCPOFFER 循环几次。
最后一件事是当服务器笔记本电脑上的 wifi 打开时,当我连接到我的 phone 时,整个通信通过 DHCPDISCOVER->DHCSPOFFER->DHCPREQUEST->DHCPACK(此时我停止在我的 phone 上访问互联网,但我猜这是因为分配的私有 IP 不适合 public 域)。这对我来说是最不重要的事情,因为我想让以太网连接网络工作,而不是 wifi 网络,但也许它包含一些重要信息。
好吧...虽然我仍然不能 100% 解释为什么广播会抛出上述异常,但是! 我设法找到了使一切正常运行的方法。事实证明,不需要更改代码
but rather the setup of the network on linux itself.
如果像我这样倒霉的人偶然发现类似的东西,我会发布我是如何修复它的。此外,肯定有一些知识渊博的人在那里,他们中的一些人可能会花时间解释发生了什么。
我的猜测:(请记住,这只是一个猜测)服务器笔记本电脑无法在网络上进行通信并且正在搜索 IP 本身 -(从另一个 DHCP 读取)所以当它是自动的分配了一个地址,该地址不适合所需的网络,因此问题出在网络设置(可能传播到套接字)而不是代码本身(或接收部分 - 255.255.255.255 BROADCAST)。