[英]How to bind to IPv6 and IPv4 individually in Java
我正在编写一些必须分别绑定到IPv6和IPv4(UDP4,UDP6)的软件。 我有一个在其他地方可以使用的现有代码库,无法为该任务进行修改。
Java具有所有优点,它会自动创建一个可以同时处理IPv6和IPv4的套接字,因此,当我现有的不可修改代码尝试创建第二组套接字时,由于该端口已在使用中,它会出错。
相关: http : //docs.oracle.com/javase/7/docs/technotes/guides/net/ipv6_guide/
我可以提供已有的代码,但认为这不会帮助回答这个问题。 非常感谢!
我的绑定函数(不是最终的生产代码):
private void bind(String uuid, String exclusiveStr, String portStr, CallbackContext c){
final JSSocket socket = socketMap.get(uuid);
boolean exclusive = Boolean.parseBoolean(exclusiveStr);
int port=0;
try{
port=Integer.parseInt(portStr);
}catch(Exception e){
//port wasn't there, use default value
}
Log.d("bind", "Attempting to bind uuid: " + uuid + " to port: " + port);
socket.bind(exclusive, port);
Log.d("bind", "new port: " + socket.getPort());
final InetAddress inetAddress = socket.getAddress();
//HashMap<String, String> setAddress= new HashMap<String,String>();
//setAddress.put("address", socket.getAddress().getHostAddress());
//setAddress.put("port", "" + socket.getPort());
JSONObject json = new JSONObject();
PluginResult result;
try {
json.put("address", socket.getAddress().getHostAddress());
json.put("port", "" + socket.getPort());
Log.d("BINDING********", json.toString());
c.success(json.toString());
}catch(JSONException e){
//todo better
e.printStackTrace();
}
}
其他代码使用Node.js的数据报模块。 我必须写那个接口。 它具有用于IPv4和IPv6的单独(据我所知)套接字。
在操作系统级别,这由IPV6_V6ONLY标志控制。 不幸的是,java似乎没有提供对此的任何访问。
一种可能的解决方法是绑定到各个IP地址。 Afaict绑定到单个IP地址将始终将您的套接字限制为一个IP版本。
您有两种选择:围绕bind()的第二次调用使用try {} catch(),并使其无害地失败。 或者,您可以一次bind(),然后尝试在IPv4和IPv6上向自己发送一个数据包,如果其中一个失败,则另一个bind()。
您的代码在其他地方工作的原因是,某些内核提供了可同时在两者上使用的套接字,而其他内核则无法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.