gpt4 book ai didi

java - 为什么 Windows Java 无法绑定(bind)到已经绑定(bind)的端口?

转载 作者:可可西里 更新时间:2023-11-01 11:46:12 24 4
gpt4 key购买 nike

我们在响应请求的时候有绑定(bind)到同一个本地端口的需求。以下是 Java 代码示例。在 Linux 上我们可以绑定(bind)到同一个端口两次,但在 Windows 上,我们在第二次绑定(bind)时出错。错误是 BindException:地址已在使用中。用 C 编写的类似程序允许我们绑定(bind)两次。是什么阻止了 Windows 上的 Java 执行此操作?是否有允许绑定(bind)的注册表设置?

import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;

public class SocketTest
{
public static void main(String[] args) throws Exception
{
Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("google.com", 80);
SocketAddress salocal = new InetSocketAddress("10.1.1.98", 9990);
s1.bind(salocal);
s1.connect(saremote);

Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("yahoo.com", 80);
SocketAddress salocal2 = new InetSocketAddress("10.1.1.98", 9990);
s2.bind(salocal2);
s2.connect(saremote2);
}
}

最佳答案

使用-Dsun.net.useExclusiveBind=false

Windows 平台上的网络 API 实现发生了变化。网络 API 的实现已在 Windows 上更改为默认使用 SO_EXCLUSIVEADDRUSE 套接字选项。此更改对于解决在使用需要绑定(bind)到同一端口的 IPv4 和 IPv6 应用程序时出现的异常是必要的。

此更改可能会导致依赖于将多个进程绑定(bind)到同一地址和端口的能力的应用程序出现问题。出现此类问题时,使用 sun.net.useExclusiveBind 系统属性作为临时解决方法来恢复遗留行为。

关于java - 为什么 Windows Java 无法绑定(bind)到已经绑定(bind)的端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44269863/

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