2011-11-29 24 views
11

Bir ServerSocket oluşturan ve localhost:7060'a bağlanan bir hizmetim var. Benim android cihaz üzerinde "netstat -an" yaptığımda, ipv4 localhost arayüzü yerine ipV6 localhost kullanıyor görüyorum.Hizmetim neden her zaman ipv4 yerine ipv6 localhost'a bağlanıyor?

çıkış aşağıdaki gibi olur:
tcp6 0 0 :: ffff: 127.0.0.1: 7060 ::: * IPv4 kullanmak

port böyle listelenen DİNLE:
TCP 0 0 127.0.0.1:5060 0.0.0.0:* DİNLEME

IPv4'ü her zaman kullanmaya zorlamak ne işe yarar? IPtables kullanarak bir port iletme kuralı ayarlıyorum. Sahip olduğum sürüm ipv4 hedef adreslerini destekliyor.

Bağlantı noktasını dinlemek için Java kodumu nasıl oluşturuyorum.

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

benim hizmetinin başlangıç ​​içinde IPv4 tercih etmeye sistem özelliğini ayarlayarak gibi diğer öneriyi. Bu hiç farketmedi.

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

Ben gömülü bir cihaz için inşa Android 2.3 bu çalıştırıyorum.

Güncelleme: Android ağacındaki InetAddress.java kaynaklarını kontrol ettim. Yukarıdaki bayrağı aşağıdaki gibi bir çizgi ile okuyor.

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

Şimdi System.setProperty() çağrısı gerçekten yukarıdaki kod tarafından okunan değeri değişiyor emin değilim.

+0

Bu sistem özelliklerinin işletim sisteminin kendisinde olduğunu düşünüyorum ve bunları programlı olarak değiştirmemesi (tüm uygulamalar aynı sistem özelliklerine bağlı olduğu için) sabitlenmeyecektir. –

+2

(Bu eski iş parçacığı başka bir yerde başvurulan olduğundan, biraz açıklama gerektiğini düşünüyorum.) ':: 1 'IPv6 localhost adresidir. ':: ffff: 127.0.0.1' değil, IPv6 notasyonunda IPv4 localhost adresi (IPv4 haritalı IPv6 adresi). Hem IPv4 hem de IPv6 paketlerini kabul edebilen çift yığınlı soketler için kullanılır. (Bir soket 'tcp46' etiketli olmasına rağmen, o zaman.) – Dubu

cevap

2

Teoride, bir IPv6 sunucusu IPv4'ü de dinler; çünkü IPv4 adres alanı IPv6'nın bir alt kümesidir, bu size gerçek sorunlara neden olur mu?

Çalışılabilecek bir numara, ilişkili IPv4 ve IPv6 adresleri olan "localhost" yerine "127.0.0.1" kullanılmasıdır.

İlgili konular