2011-11-29 240 views
11

我有一個服務創建一個ServerSocket並綁定到localhost:7060。當我在我的android設備上執行「netstat -an」時,我發現它使用的是ipv6 localhost而不是ipv4 localhost接口。爲什麼我的服務總是綁定到ipv6 localhost而不是ipv4?

輸出是這樣的:
TCP6 0 0 :: FFFF:127.0.0.1:7060 ::: * LISTEN

使用IPv4中的端口列出如下:
TCP 0 0 127.0.0.1:5060 0.0.0.0:* LISTEN

強迫它總是使用IPv4的訣竅是什麼? 我正在使用iptables設置端口轉發規則。版本我支持ipv4目的地址。

這就是我如何創建我的Java代碼以偵聽端口。

InetAddress localAddress = Inet4Address.getByName("localhost"); //InetAddress localAddress = Inet4Address.getLocalHost(); sockServer = new ServerSocket(nPort, 20, localAddress);

我跟着,如設置系統屬性設置爲首選IPv4在我服務的啓動其他建議。這沒有任何區別。

System.setProperty("java.net.preferIPv4Stack", "true");

我在Android 2.3的嵌入式設備內置運行此。

更新: 我檢查了Android樹中的InetAddress.java來源。它正在用下​​面的一行閱讀上面的標誌。

static boolean preferIPv6Addresses() { 
     String propertyName = "java.net.preferIPv6Addresses"; 
     String propertyValue = AccessController.doPrivileged(new PriviAction<String>(propertyName)); 
     return Boolean.parseBoolean(propertyValue); 
    } 

現在我不知道System.setProperty()調用真正改變由上面的代碼讀取值。

+0

我認爲這些系統屬性是在操作系統本身,並以編程方式更改它們不會堅持(因爲所有的應用程序都依賴於相同的系統屬性)。 –

+2

(因爲這個老的線程被其他地方引用了,我想需要一些說明。)':: 1'是IPv6本地主機地址。 ':: ffff:127.0.0.1'不是,它是IPv6表示法中的IPv4本地主機地址(所謂的「IPv4映射」IPv6地址)。它用於可以接受IPv4和IPv6數據包的雙堆棧套接字。 (儘管套接字應該標記爲「tcp46」,然後。) – Dubu

回答

2

從理論上講,IPv6服務器也會監聽IPv4,因爲IPv4地址空間是IPv6的一個子集,這是否會給您帶來真正的問題?

可能有用的一個技巧是使用「127.0.0.1」而不是「localhost」,它具有IPv4和IPv6地址關聯。

相關問題