java.net.BindException:无法在LinkLocal rebind上分配请求的地址(绑定失败)

时间:2020-11-06 18:06:05

标签: java network-programming udp ipv6 link-local

我正在使用UDP用Java编写网络框架原型,以处理使用它的设备可能没有永久和/或可靠连接的情况以及如何处理它。要求我必须能够将其与“常规” IPv4和IPv6地址以及IPv6 LinkLocal地址一起使用。

由于这个概念,设备有时会失去连接,我必须关闭绑定到特定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)

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

任何建议都值得赞赏

TL; DR:使用DatagramSockets绑定到与IPv6 LinkLocal地址相对应的IP /端口对,关闭该DatagramSocket并将其重新绑定到相同的IPv6 LinkLocal Address会导致Exception,即使相同的代码适用于任何其他情况我可以使用“正常” IPv4和IPv6地址进行测试

0 个答案:

没有答案