我有一個服務創建一個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()調用真正改變由上面的代碼讀取值。
我認爲這些系統屬性是在操作系統本身,並以編程方式更改它們不會堅持(因爲所有的應用程序都依賴於相同的系統屬性)。 –
(因爲這個老的線程被其他地方引用了,我想需要一些說明。)':: 1'是IPv6本地主機地址。 ':: ffff:127.0.0.1'不是,它是IPv6表示法中的IPv4本地主機地址(所謂的「IPv4映射」IPv6地址)。它用於可以接受IPv4和IPv6數據包的雙堆棧套接字。 (儘管套接字應該標記爲「tcp46」,然後。) – Dubu