gpt4 book ai didi

java - 将端口重新绑定(bind)到不同 IP 上的数据报套接字

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:23 26 4
gpt4 key购买 nike

在我的应用程序中,我创建了一个 datagarm 套接字并将一个端口绑定(bind)到 9999 到 ip 192.168.173.1 现在我想将该端口绑定(bind)到一个新的 ip 192.168.173.2但我做不到我遵循的步骤

1 DatagramSocket s= new DatagramSocket(port,ip1);
2 s.disconnect();

s.close();

s= new DatagramSocket(port,ip2);

但这给出了一个

java,net,BindException :Address already in use : Cannot bind

任何见解都会非常有帮助。

最佳答案

为了避免在尝试解除绑定(bind)和重新绑定(bind)时出现异常,您可以将每个创建的套接字设置为可重用。为此,您必须创建一个未绑定(bind)套接字:

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(someSocketAddress);

更多信息: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean )

附言在这种情况下使用 TCP 时,超时时间是 BindException 的主要原因可能不适用于 UDP 套接字,但 SO_REUSE 应该允许您立即重新绑定(bind)。 http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean )

这里有几个例子:

final int port = 55880;

A) 不重用,不关闭 = 地址已被使用

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress("127.0.0.1", port));

s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("localhost", port));

B) 重用,不关闭 = 无投诉

DatagramSocket s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("127.0.0.1", port));

s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress("localhost", port));

C) 不重用,关闭 = 无投诉(仅适用于数据报套接字)

DatagramSocket s = new DatagramSocket(null);
s.bind(new InetSocketAddress("127.0.0.1", port));
s.close();

s = new DatagramSocket(null);
s.bind(new InetSocketAddress("localhost", port));
s.close();

关于java - 将端口重新绑定(bind)到不同 IP 上的数据报套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10071107/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com