gpt4 book ai didi

java - java中的IPv6唯一套接字

转载 作者:行者123 更新时间:2023-11-30 08:59:27 28 4
gpt4 key购买 nike

是否可以在 java 中创建一个仅绑定(bind)到 ipv6 地址的套接字?

我想知道我是否可以在一台机器上有 2 个套接字,一个绑定(bind)到 ipv4 地址,另一个绑定(bind)到 ipv6 地址。 Networking IPv6 User Guide for JDK/JRE 5.0解释了 ipv6 如何在 Java 平台上工作,但没有说明仅 ipv6 套接字。他们甚至可能吗?我无法设置全局 IPV6_V6ONLY 属性。

最佳答案

我需要同样的东西——有单独的 tcp 套接字(IPv4 和 IPv6),它们在相同的端口号上监听。我找到的唯一解决方案是为主机上的每个地址创建一对套接字(IPv4 和 IPv6)。

为了简单起见,以下代码仅限于在本地主机上监听。它创建两个 ServerSocket 实例。其中之一绑定(bind)到 IPv4 本地主机,其中一个绑定(bind)到 IPv6 本地主机。

import java.io.*;
import java.net.*;

public class DualSock implements Runnable {

ServerSocket s;
String ver;
static final int port = 1234;

public void run() {
while (true) {
try {
Socket client = s.accept();
System.out.println("Connection over " + ver + " from " + client.getRemoteSocketAddress());
client.close();
} catch (Exception e) {
System.out.println(e);
System.exit(1);
}
}
}

public DualSock(ServerSocket s, String ver) {
this.s = s;
this.ver = ver;
}

public static void main(String argv[]) throws Exception {
InetAddress address4 = InetAddress.getByName("127.0.0.1");
ServerSocket server4 = new ServerSocket(port, 5, address4);
DualSock ip4app = new DualSock(server4, "IPv4");

InetAddress address6 = InetAddress.getByName("::1");
ServerSocket server6 = new ServerSocket(port, 5, address6);
DualSock ip6app = new DualSock(server6, "IPv6");

new Thread(ip4app).start();
new Thread(ip6app).start();
}
}

限制与本地主机的通信不是很有用。一个真正的应用程序需要enumerate network interfaces ,获取它们的地址,然后为主机上的每个地址创建一个 ServerSocket

关于java - java中的IPv6唯一套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27280015/

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