# binden auf eine bstimmte IP und Netzwerkinterface



## Guest (6. Nov 2008)

Hi all,

Ich habe auf meinem rechner 2 Unterschiedliche Netzwerkkarten mit verschiedenen Subnets (bzw. bekommen ihre IP über DHCP).

eth0  192.168.112.1     192.168.112.1
eth1  192.168.123.100  192.168.123.100

Ich möchte das mein Java Programm eine bestimmte IP verwendet um einen Socket zu binden.

Das Problem habe ich auch wenn ich RTP verwende

String url = "rtp://192.168.123.100:49600/audio/16";

Obwohl ich die 192.168.123.100 IP angebe bindet java den Port 49600 auf 192.168.112.1 ? 

kennt sich da wer aus wie ich das steuern kann?

thx
jotun


----------



## tuxedo (7. Nov 2008)

Lass doch mal n bisschen Sourcecode vom SocketServer sehen... Dann sehen wir was du "falsch" machst.

Im fall von Java NIO funktioniert das so:


```
// Bind the server socket to the specified address and port
		InetSocketAddress isa = new InetSocketAddress(address, listenPort);
		serverChannel.socket().bind(isa);
```

Im Falle von Java IO (ist etwas gebräuchlicher), bietet die API ja folgenden Konstruktor für ServerSocket an:


```
public ServerSocket(int port,
                    int backlog,
                    InetAddress bindAddr)
             throws IOException
```

Oder meinst du das Problem, dass beim Öffnen einer ausgehenden Verbindung Java über das falsche Netzwerkinterface geht?!



- Alex


----------



## Guest (7. Nov 2008)

ja genau den dritten punkt den du angeführt hast meine ich


```
String localHost = null;
		try {
			localHost = InetAddress.getLocalHost().getHostName();
		} catch (UnknownHostException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} try {
			for ( InetAddress ia : InetAddress.getAllByName(localHost) ) System.out.println( ia );
		} catch (UnknownHostException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		String url = "rtp://192.168.123.100:49600/audio/16";

		MediaLocator mrl = new MediaLocator(url);
```

hamer/192.168.112.1
hamer/192.168.123.100
Open log file: C:\WINDOWS\TEMP\jmf.log
Player created.

das mit der local IP hab ich nur testweise reingegeben um zu sehen welche IPs es gibt und anscheinend nimmt er die erste die er findet trauriger weise 

er nimmt das falsche netzwerkinterface .. er nimmt nämlich 192.168.112.1 mit port 49600 anstatt wie ich im url definiere 192.168.123.100:49600


----------



## HoaX (7. Nov 2008)

das hat nichts direkt mit java zutun sonderm mit dem routing der datenpakete. da du ja nach localhost verbindest geht der verkehr eh übers loopback und nicht wirklich über das zur ip gehörende device.


----------



## Guest (9. Nov 2008)

hallo again,

Ich habe das Problem mittlerweile genau lokalisiert:

Ich mache natürlich einen Server Socket auf IPort

Dies übergeben ich mit String URL dem javax.media.MediaLocator

Der allerdings verwendet das Netzwerkinterface mit der höchsten Hex nummer im windows cmd

Auszug aus cmd.exe route print:
C:\Dokumente und Einstellungen\Administrator>route print
===========================================================================
Schnittstellenliste
0x1 ........................... MS TCP Loopback interface
0x50003 ...00 00 56 c0 22 01 ...... VMware Virtual Ethernet Adapter for VMnet1
0x50005 ...00 00 56 c0 22 08 ...... VMware Virtual Ethernet Adapter for VMnet8
0x70002 ...00 8f 81 1c 00 1a ...... Attansic L1 Gigabit Ethernet 10/100/1000Base
-T Controller - Paketplaner-Miniport
===========================================================================

nämlich 0x70002 

deinstalliere ich beispielsweise das vmnet1 und installiere es wieder bekommt es automatisch die höchste schnittstellennummer und wird somit auch vom java als erste IP Adresse bei InetAddress ausgegeben.

Mein Problem liegt jetzt darin dass ich nicht weiss wie ich einer API (javax) beibringen kann welches Netzwerkinterface diese verwenden soll...

Gibts einen Source Code vom javax.media.MediaLocator ? damit ich eins deiner server socket bind Beispiele verwenden kann?

oder kann ich den MediaLocator durch irgendetwas anderes ersetzen?

vielen dank 
jotun


----------



## HoaX (10. Nov 2008)

wieso ist es für dich wichtig woran der socket lokal gebunden ist?


----------



## Guest (10. Nov 2008)

weil ich Schnittstellen habe die nicht nach aussen geroutet werden 

Sprich die sind von aussen nicht erreichbar wenn die api so wie eine andere die ich verwende auf 0.0.0.0 binden würde wäre es mir ja auch recht aber die falsche ip is halt blöd


----------



## HoaX (11. Nov 2008)

versteh ich nicht


----------



## tuxedo (11. Nov 2008)

Ich auch nicht. Bei verbindungen via "localhost" (und das sieht stark danach aus ;-) ), ist es völlig wurscht welches Interface benutzt wird, da AFAIK eh kein einziges Byte die Netzwerkkarte wirklich erreicht.

- Alex


----------



## HoaX (11. Nov 2008)

eben,  und wenn die pakete den rechner verlassen haben die pakete die passende absenderadresse automatisch, dafür hat ja der rechner ne routingtabelle.


----------



## Guest (11. Nov 2008)

hmmm ok .. ich versuchs nochmal

ich bin server und habe zwei netze 

IP öffentlich 80.34.122.72

IP intern 192.168.1.1

wenn mein programm nun einen listen socket auf 192.168.1.1 aufbaut und nicht auf die öffentliche ...
dann kommt ein client der beispielsweise auf 80.34.122.72:8080 verbinden möchte nicht mehr hin

es sei denn der server socket würde auf 0.0.0.0:8080 hören dann wärs wie ihr sagt wurscht ob ich vom öffentlichen oder vom lokalen netz komme

blöderweise baut meine api auf die lokale IP auf weil eben der anscheinend nach dem schnittstellenindex aus dem windows route print den höchsten index als bind addr nimmt.

eine ausgehende verbindung is völlig egal da sucht sich durch windows routing eh das richtige interface von selbst

oder hab ich jetzt nach tagelangem grübeln einen mega knoten im hirn?  :bahnhof:


----------



## HoaX (12. Nov 2008)

in deinem beispielcode bist du aber client und nicht server?

new InetAddress("0.0.0.0") oder so und fertig!?


----------



## tuxedo (12. Nov 2008)

Entweder auf 0.0.0.0 binden, oder halt auf die jeweilige IP. Aber wie ich schon ganz am Anfang geschrieben hab betrifft das die Serversocket.

Bei Clientverbindungen ist das prinzipiell wurscht wenn a) das Routing stimmt und b) im OS alles korrekt eingestellt ist. 

- Alex


----------

