繁体   English   中英

如何在Java中分别绑定到IPv6和IPv4

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM