java.net.BindException:无法在LinkLocal重新绑定上分配请求的地址(绑定失败)
我正在用Java编写一个网络框架原型,使用UDP处理使用它的设备可能没有永久和/或可靠连接的时刻,以及它应该如何处理。我必须能够将其与“正常”IPv4和IPv6地址以及IPv6本地地址一起使用 由于这一概念,有时设备会失去连接,我必须关闭绑定到特定IP/端口对的所有DatagramSockets,以便释放资源,一旦设备获得新连接,我需要将套接字“重新绑定”到给定地址 当我使用“正常”IPv4和IPv6地址进行测试时,代码没有问题,但一旦我开始使用IPv6 LinkLocal地址,当我尝试将DatagramSocket重新绑定到任何LinkLocal地址时,就会出现此异常:java.net.BindException:无法在LinkLocal重新绑定上分配请求的地址(绑定失败),java,network-programming,udp,ipv6,link-local,Java,Network Programming,Udp,Ipv6,Link Local,我正在用Java编写一个网络框架原型,使用UDP处理使用它的设备可能没有永久和/或可靠连接的时刻,以及它应该如何处理。我必须能够将其与“正常”IPv4和IPv6地址以及IPv6本地地址一起使用 由于这一概念,有时设备会失去连接,我必须关闭绑定到特定IP/端口对的所有DatagramSockets,以便释放资源,一旦设备获得新连接,我需要将套接字“重新绑定”到给定地址 当我使用“正常”IPv4和IPv6地址进行测试时,代码没有问题,但一旦我开始使用IPv6 LinkLocal地址,当我尝试将Dat
java.net.BindException: Cannot assign requested address (Bind failed)
at java.base/java.net.PlainDatagramSocketImpl.bind0(Native Method)
at java.base/java.net.AbstractPlainDatagramSocketImpl.bind(AbstractPlainDatagramSocketImpl.java:131)
at java.base/java.net.DatagramSocket.bind(DatagramSocket.java:394)
因为这段代码适用于非LinkLocal地址,所以我认为它也适用于LinkLocal地址
下面是我用来将DatagramSocket绑定到IP/端口对的代码:
private void bindDatagramSocket() {
try {
this.ds = new DatagramSocket(null);
InetSocketAddress isa = new InetSocketAddress(this.ip, this.port);
this.ds.bind(isa);
this.hasConnection = true;
}
catch (SocketException e) {
e.printStackTrace();
}
其中this.ip和this.port由另一个线程更新,该线程检测可用地址和连接状态(有/无连接)的更改。
当检测到连接丢失时,我使用此代码关闭正在使用的DatagramSocket(this.ds)
如有任何建议,我们将不胜感激
TL;DR:使用DatagramSockets绑定到与IPv6链接本地地址对应的IP/端口对,关闭该DatagramSocket并将其重新绑定到相同的IPv6链接本地地址会导致异常,即使相同的代码适用于我可以使用“正常”测试的任何其他情况IPv4和IPv6地址是否将区域ID与IPv6链路本地地址一起包括在内?这对于链路本地地址是必需的,因为每个接口将使用相同的链路本地网络。”因为相同的非全局地址可能在同一作用域的多个区域中使用(例如,在两个单独的物理链路中使用链路本地地址fe80::1),并且节点可能具有连接到同一作用域的不同区域的接口(例如,路由器通常有多个连接到不同链路的接口),节点需要一种内部方法来识别非全局地址属于哪个区域。”“这是通过在节点内分配一个不同的”区域索引来实现的“连接到该节点所连接的同一作用域的每个区域,并允许地址的所有内部使用由区域索引限定。“我不认为这是问题所在。在这个框架中,我必须意识到存在多个NIC,并直接从它们获取地址。也就是说,我从它们获取的链接本地地址类型类似于fe80::1%NIC(例如:fe80:0:0:458d:14b:2c2b:57db%wlp3s0)
public void updateConnectionStatus(boolean value){
this.connectionLock.lock();
this.hasConnection = value;
this.connectionLock.unlock();
if(value && !this.isRunning){
new Thread(this).start();
}
else{
if(!value) {
this.ds.close();
this.ds = null;
}
}