T
tim234
Gast
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):
dieser code bindet wie erwartet den socket an die adresse 10.0.0.3. ein kurzer abstecher in die konsole bestätigt dies:
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:
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?
also ich erstelle den socket folgendermaßen (ich beschränke mich dabei auf das wesentliche):
Java:
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:
Code:
# 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:
Java:
DatagramSocket socket = new DatagramSocket(new InetSocketAddress(10522));
Code:
# 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?