2013-07-24 87 views
0

我啓動一個服務器套接字,並希望它監聽環回地址(127.0.0.1)。該代碼如下: ......爲什麼android上的套接字服務器總是監聽IPv6?

Inet4Address address = (Inet4Address) Inet4Address.getByName("localhost"); 
TServerSocket server = new TServerSocket(new InetSocketAddress(address ,1234)); 
......... 

public class TServerSocket{ 
...... 
    public TServerSocket(InetSocketAddress bindAddr, int clientTimeout) throws    TTransportException { 
clientTimeout_ = clientTimeout; 
try { 
    serverSocket_ = new ServerSocket(); 
    serverSocket_.setReuseAddress(true); 
    serverSocket_.bind(bindAddr); 
} catch (IOException ioe) { 
    serverSocket_ = null; 
    throw new TTransportException("Could not create ServerSocket on address " +  bindAddr.toString() + "."); 
} 
    } 
    ...... 
} 

但是我發現,這個套接字開始監聽IPv6地址「:FFFF:127.0.0.1」使用命令「netstat的」,並且它 導致在另一個進程(使用Python)中運行的客戶端無法通過「127.0.0.1」連接到此服務器。

爲什麼android會自動將IPV4地址映射到IPv6地址?

+0

到底是如何,你在Android上運行的Python? –

+0

https://code.google.com/p/python-for-android/ – user2612791

+0

[爲什麼我的服務總是綁定到ipv6 localhost而不是ipv4?](http://stackoverflow.com/questions/8319399 /爲什麼 - 不,我的服務,總是綁定到IPv6的本地主機,INSTEAD-OF-IPv4)的 –

回答

0

它沒有將IPv4地址映射到IPv6。 Inet4AddressInet6Address還沒有實施getByName()方法,因此您實際上使用的是從InetAddress繼承的方法。如果IPv4和IPv6都可以訪問主機,那麼大多數操作系統都會比IPv4更喜歡IPv6(所以你應該:))。您可以嘗試通過InetAddress.getAllByName("localhost")獲取地址數組,然後檢查地址是否爲Inet4Address(或其他情況下爲Inet6Address)的實例,但此示例的最簡單解決方案是硬編碼環回地址(127.0.0.1),因爲幾乎沒有機會它的變化。