2012-04-30 6 views
15

Uno del nostro programma Java quando viene avviato, si ascolta solo su IPv6 (8080)Come sostenere sia IPv4 che IPv6 e su Java

esempio

# netstat -ntpl 

Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN  -    
tcp6  0  0 :::8080     :::*     LISTEN  -    
tcp6  0  0 :::22     :::*     LISTEN  -    

Il problema è che non è accessibile dall'esterno (ad eccezione di localhost), per risolvere questo, ho questo aggiungere manualmente

-Djava.net.preferIPv4Stack=true 

Ma questo rende il programma è solo per la rete IPv4.

E 'possibile fare qualcosa come lo sshd come sopra, entrambi supportano IPv4 e IPv6?

risposta

21

ho il sospetto è meno un problema di programmazione Java di un OS stack di rete/rete OS problema di configurazione:

http://coding.derkeiler.com/Archive/Java/comp.lang.java.help/2009-09/msg00087.html

Su alcuni sistemi operativi, un singolo socket TCP nativo può ascoltare una porta su entrambi IPv4 e IPv6 contemporaneamente. È in grado di accettare connessioni da IPv4 remoto e da client IPv6 remoti. Su altri SO (come WinXP) un socket nativo del sistema operativo NON può farlo, ma può accettare solo da IPv4 o IPv6, non entrambi. Su quei sistemi operativi, è necessario disporre di due prese di attesa per poter accettare le connessioni da entrambi i client IPv4 e IPv6 remoti, un socket per ascoltare le connessioni IPv4 e uno per IPv6.

Windows 7 e Windows Server 2008 gestiscono gli stack in doppio; Windows XP non così tanto :)

Sembra che tu sia su Linux - i più moderni desktop e server Linux gestiscono anche ipv6 con doppio ipv6 senza problemi.

Ecco un buon articolo su interoperabilità:

Sai come si può "spegnere" IPv6 per l'applicazione Java: -Djava.net.preferIPv4Stack=true

È anche possibile forzare il server utilizzare IPV6 come questo: echo 0 > /proc/sys/net/ipv6/bindv6only

Questo è probabilmente il tuo b fonte est:

devi assolutamente essere in grado di realizzare ciò che si vuole (almeno a livello di programmazione Java), a meno che non si è limitato da problemi di rete esterni:

Nodes)  V4 Only V4/V6 V6 Only 
      ------- ----- ------- 
V4 Only  x  x 
V4/V6  x  x  x 
V6 Only    x  x 

PS:

Ecco un altro link valido, che spiega cosa sta succedendo a livello di socket.Non è Java (è C), ma esattamente i principi di esempio si applicano: