2013-07-24 3 views
0

서버 소켓을 시작하고 루프백 주소 (127.0.0.1)에서 수신 대기해야합니다. ......왜 안드로이드의 소켓 서버가 항상 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"를 명령하고, 은 (파이썬에서) 다른 프로세스에서 실행중인 클라이언트가 "127.0.0.1"을 통해이 서버에 연결할 수 없게 만들었습니다.

왜 안드로이드가 IPV4 주소를 IPv6 주소로 자동 매핑 했습니까?

+0

는 정확히 어떻게 당신은 당신의 안드로이드에 파이썬을 실행? –

+0

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

+0

[내 서비스가 항상 ipv4 대신 ipv6 localhost에 바인딩되는 이유는 무엇입니까?] (http://stackoverflow.com/questions/8319399)/why-does-my-service-always-bind-to-ipv6-localhost-ipv4 대신) –

답변

0

IPv4 주소를 IPv6에 매핑하지 않았습니다. Inet4AddressInet6Address은 의 상속 된 메서드를 실제로 사용하므로 getByName() 메서드를 구현하지 않았습니다. IPv4와 IPv6 모두에서 호스트에 연결할 수있는 경우 대부분의 운영 체제는 IPv4보다 IPv6를 선호합니다. 주소 배열을 InetAddress.getAllByName("localhost")으로 가져온 다음 주소가 Inet4Address (또는 다른 경우에는 Inet6Address) 인지를 확인할 수 있지만이 예제의 가장 쉬운 해결책은 루프백 주소 (127.0.0.1)를 하드 코딩하는 것입니다. 사실상 기회가 없기 때문입니다 변화하는 것.