Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.net.BindException:无法在LinkLocal重新绑定上分配请求的地址(绑定失败)_Java_Network Programming_Udp_Ipv6_Link Local - Fatal编程技术网

java.net.BindException:无法在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编写一个网络框架原型,使用UDP处理使用它的设备可能没有永久和/或可靠连接的时刻,以及它应该如何处理。我必须能够将其与“正常”IPv4和IPv6地址以及IPv6本地地址一起使用

由于这一概念,有时设备会失去连接,我必须关闭绑定到特定IP/端口对的所有DatagramSockets,以便释放资源,一旦设备获得新连接,我需要将套接字“重新绑定”到给定地址

当我使用“正常”IPv4和IPv6地址进行测试时,代码没有问题,但一旦我开始使用IPv6 LinkLocal地址,当我尝试将DatagramSocket重新绑定到任何LinkLocal地址时,就会出现此异常:

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