Debian, java et NoRouteToHostException
Par Sébastien Le Ray le jeudi 17 décembre 2009, 19:38 - Réseau - Lien permanent
Une histoire de réseau qui fonctionne pas en java mais qui fonctionne partout ailleurs...
Si vous développez en Java en utilisant Debian, et plus particulièrement si vous faites du réseau avec Java, vous êtes peut être tombé récemment sur cette exception :
Exception in thread "main" java.net.NoRouteToHostException: Network is unreachable
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:310)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:176)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:163)
at java.net.Socket.connect(Socket.java:542)
at java.net.Socket.connect(Socket.java:492)
at sun.net.NetworkClient.doConnect(NetworkClient.java:174)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:409)
at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
at sun.net.www.http.HttpClient.<init>(HttpClient.java:240)
at sun.net.www.http.HttpClient.New(HttpClient.java:321)
at sun.net.www.http.HttpClient.New(HttpClient.java:338)
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:814)
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:755)
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:680)
at NetworkTest.main(NetworkTest.java:11)
Qui est facilement reproductible avec un programme du genre :
import java.net.URL;
import java.net.URLConnection;
import java.io.IOException;
public class NetworkTest {
public static void main(String[] args) throws IOException {
URL u = new URL("http://152.46.7.65");
URLConnection uc = u.openConnection();
uc.connect();
}
}
Cela vient d'un nouveau paramètre sysctl introduit récemment dans unstable :
sebastien@boiboite ~ $ cat /etc/sysctl.d/bindv6only.conf # This sysctl sets the default value of the IPV6_V6ONLY socket option. # # When disabled, IPv6 sockets will also be able to send and receive IPv4 # traffic with addresses in the form ::ffff:192.0.2.1 and daemons listening # on IPv6 sockets will also accept IPv4 connections. # # When IPV6_V6ONLY is enabled, daemons interested in both IPv4 and IPv6 # connections must open two listening sockets. # This is the default behaviour of almost all modern operating systems. net.ipv6.bindv6only = 1
C'est lui qui casse le code réseau Java, un simple sudo sysctl -w net.ipv6.bindv6only=0 contournera le problème en attendant qu'il soit réglé...
Commentaires
merci !