# Problem mit Socket und fe80 (IPv6)



## Eisscholle (14. Okt 2008)

Hallo,

ich habe ein Problem mit Socket und einer fe80-Adresse.

Ich habe folgendes Codefragment:

```
socket = new Socket( ip, port );
```

Nehme ich als IP z.B: 127.0.0.1 läuft mein Programm wunderbar. Nehme ich eine IPv6-Adresse (außer fe80....), klappt es auch. Nun habe ich aber ein Problem mit den fe80-Adressen.

Folgender config-Auszug:


```
eth0      Link encap:Ethernet  HWaddr 00:07:32:06:bb:6c  
          inet addr:v.x.y.z  Bcast:v.x.y.z  Mask:255.255.255.0
          inet6 addr: fe80::207:32ff:fe06:bb6c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:22237 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17224 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:21830035 (20.8 MB)  TX bytes:3127567 (2.9 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:678 errors:0 dropped:0 overruns:0 frame:0
          TX packets:678 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:36586 (35.7 KB)  TX bytes:36586 (35.7 KB)
```

Übergebe ich in meinem Code der Variablen ip die Adresse "fe80::207:32ff:fe06:bb6c" oder "fe80::207:32ff:fe06:bb6c%2" bleibt das Programm bei der Socket-Verbindung hängen. Es bringt keine Fehlermeldung wie Host nicht gefunden etc., sondern ist einfach tot, reagiert nicht weiter. Ändere ich aber nur ein Zeichen in der fe80-Adresse, kommt sofort die Exception Host nicht bekannt. Also scheint er mit der o.g. Adresse den Host wohl zu finden aber wieso er dann nicht reagiert...... Hat jemand Erfahrung damit oder kann mir helfen!?

Vielen Dank!


----------



## Gast2 (14. Okt 2008)

Moin,

ein Schuss ins Blaue .. ersetzt mal "fe80::207:32ff:fe06:bb6c" durch "fe80::*0*207:32ff:fe06:bb6c" ... evt. mag er da auch 4 Stellen haben

hand, mogel


----------



## Eisscholle (14. Okt 2008)

Hi,

daran liegt es nicht. Das Problem existiert weiter. Gehe ich mit dem Eclipse-Debugger durch, bleibt der auch genau bei dem new Socket.... hängen. Da gibt es eigentlich gar keinen Grund dazu.

VG


----------



## HoaX (14. Okt 2008)

was du als fe80-adresse bezeichnest wird korrekt als link local adresse bezeichnet. um die verwenden zu können musst du die schnittstelle mit angeben über die diese adresse erreichbar ist. in deinem fall solltest du also fe80::207:32ff:fe06:bb6c%eth0 verwenden um bei dir selbst raus zu kommen


----------



## HoaX (14. Okt 2008)

btw: wie bist du auf das %2 bei dem einen versuch gekommen? 0o


----------



## Eisscholle (14. Okt 2008)

Hi,

auf die %2 bin ich mit folgendem Codefragment gekommen:


```
while ( netInter.hasMoreElements() ) 
			{ 
			  NetworkInterface ni = netInter.nextElement(); 
 
			  for ( InetAddress iaddress : Collections.list(ni.getInetAddresses()) ) 
			  {
```
Und dort bekomme ich eine Adresse mit %2 am Ende. Ich habe da auch schon andere Werte wie %0, %1 usw. probiert aber genau das gleiche Verhalten - es fährt sich fest. Verbinde ich mich zu ::1 klappt es. Er scheint also wirklich irgendwie ein Problem mit fe80 und den Interface-Bezeichnungen zu haben.

Hier mal mein Testcode:


```
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;


public class feTest {

	public static void main(String... args) {

//fe80::207:32ff:fe06:bb6c%2
			try {
				Socket socket = new Socket( "fe80::207:32ff:fe06:bb6c%2", 4000 );
				System.out.println("Jetzt ist offen.");
				socket.close();
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
}
```

VG


----------



## Eisscholle (14. Okt 2008)

Hi,

noch eine kurze Anmerkung. Nach guten 3 Minuten kommt folgende Exception:



> java.net.ConnectException: Connection timed out
> at java.net.PlainSocketImpl.socketConnect(Native Method)
> at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
> at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
> ...



Das die kommt ist m.E. soweit klar aber dann muss ja eine Verbindung entstanden sein.

Ist diese ganze Problematik noch nicht in Java implementiert?

VG


----------



## HoaX (14. Okt 2008)

ich weiß nicht woran es liegt aber es geht scheinbar nicht in java die eigene link local adresse zu verwenden.

andere rechner als zeil erreiche ich, die eigene link local nicht. frag doch mal bei sun im forum


----------



## Eisscholle (14. Okt 2008)

Hi,

diese Feststellung habe ich gerade auch gemacht. Ich habe diesen Beitrag hier gefunden: https://lists.linux-foundation.org/pipermail/bugme-new/2006-October/015198.html

Scheint wirklich eine Art Bug zu sein.

Danke!

VG


----------



## HoaX (14. Okt 2008)

dein link hat aber nix mit java zu tun. wenn ich das ganze mittels netcat probiere funktionierts. kann mich auch über link local per ssh einloggen. nur mit java läuft das ins leere

mit netcat-openbsd unter ubuntu:
nc -6 -l 8881
und dann auf weiterer konsole:
echo hallo | nc -6  fe80::2e0:7dff:fee1:9183%br0 8881

geht.

es kann zwar sein, aber ich glaube es nicht, dass all die programme da intern hacks machen dass das funktioniert


----------

