2015-06-22 78 views
1

我在寫一些必須單獨綁定到IPv6和IPv4(UDP4,UDP6)的軟件。我有一個現有的代碼庫,可以在其他地方工作,並且無法修改此任務。它的所有榮耀都會自動創建一個既可處理IPv6又可處理IPv4的套接字,因此,當我現有的不可修改代碼嘗試創建第二套套接字時,由於該端口已被使用,所以它會出錯。如何在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的套接字。

+0

爲什麼現有的代碼庫在這裏工作,當它在別處工作? –

+0

請參閱上面的代碼和原因 –

回答

-1

有兩種選擇:在bind()的第二次調用周圍嘗試{} catch(),並允許它無害地失敗。或者你可以bind()一次,然後嘗試在IPv4和IPv6上發送數據包,如果兩者都失敗,則bind()另一個。

你的代碼在其他地方工作的原因是一些內核提供了一個適用於兩者的套接字,而其他的則不然。

0

在操作系統級別,這由IPV6_V6ONLY標誌控制。不幸的是,java似乎沒有提供任何訪問權限。

一種可能的解決方法可能是綁定到單個IP地址。 Afaict綁定到單獨的IP地址將始終將您的套接字限制爲一個IP版本。