# udp socket an interface binden



## tim234 (30. Mrz 2011)

ich versuche gerade einen datagramm socket an ein bestimmtes interface zu binden. dies ist nötig, das der rechner, auf den das ganze laufen soll mehrere netzwerkschnittstellen hat, aber nur auf einer soll der dienst laufen.

also ich erstelle den socket folgendermaßen (ich beschränke mich dabei auf das wesentliche):


```
DatagramSocket socket = new DatagramSocket(new InetSocketAddress("10.0.0.3", 10522));
DatagramPacket data = new DatagramPacket(new byte[512], 512);
socket.receive(data);
...
```

dieser code bindet wie erwartet den socket an die adresse 10.0.0.3. ein kurzer abstecher in die konsole bestätigt dies:


```
# netstat -ulpen
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name 
...
udp        0      0 10.0.0.3:10522          0.0.0.0:*                           1034       4613165    24898/java
...
```

aber nun zum eigentlich problem: dieser socket empfängt nichts. das eintreffen der packete von einem udp sender läßt sich allerdings sowohl durch die firewall (iptables), als auch mit wireshark bestätigen.

beim experimentieren fiel mir auf, das wenn ich die explizite adresse "10.0.0.3" zum binden entferne, der socket wie von zauberhand plötzlich in der lage ist daten zu empfangen:


```
DatagramSocket socket = new DatagramSocket(new InetSocketAddress(10522));
```


```
# netstat -ulpen
Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode      PID/Program name 
...
udp        0      0 0.0.0.0:10522           0.0.0.0:*                           1034       4881757    26029/java
...
```

jetzt kann zwar der socket empfangen, aber er tut dies eben auf allen netzwerk schnittstellen... also genau das, was ich nicht wollte.

wie also kann ich dein datagramm socket an ein bestimmtes interface binden so das dieses auch tatsächlich daten empfängt?


----------



## HoaX (30. Mrz 2011)

Kommen denn die Daten auch wirklich aus dem Netzwerk an diese Schnittstelle? Oder testest du das, indem du lokal an die IP und Port sendest?


----------



## tim234 (30. Mrz 2011)

gesendet wird von einem physikalisch externen rechner! der eingehende traffic läßt sich wie bereits beschrieben mit wireshark anzeigen und auswerten. die pakete (von sender zu empfänger) kommen also definitiv an.

da ich mittlerweile ein java problem ausschließen kann (mit c++/qt habe ich das gleiche problem reproduzieren können) bleibt fast nur noch ein problem auf system ebene.

erklärung:

erstelle ich einen udp socket NUR mit port wird er auf die adresse 0.0.0.0:{port} gebunden. lasse ich dann den socket laufen, bombadiere ihn mit paketen und rufe diese nicht ab, kann ich in der konsole beobachten, wie der eingangs-puffer (spalte "Recv-Q" des befehls "netstat -ulpen") vollläuft (alles normal also). erstelle ich den socket mit ip-adresse (10.0.0.3) und port wird er ebenfalls wie erwartet an die adresse 10.0.0.3:{port} gebunden. auch hier sende ich wieder pakete, ohne diese abzurufen... der puffer bleibt diesmal leer (warum?).

weiß jemand warum das so ist? möglicherweise ein problem von linux? ich habe leider gerade kein windows system um das zu testen


----------



## Experimental (4. Nov 2011)

Hallo, hatte hier vor kurzem ein ähnliches verhalten. Das ich auf einem Datagrammsocket packete erwartete aber keine angezeigt wurden. Aber die TCPDUMP zeigte sie. 

Ich konnte das mit einem korrekten routing Eintrag für das entsprechende Interface beheben.

cu


----------

