2012-07-13 3 views
6

Ho due interfacce in un host Solaris. Vorrei avviare due connessioni TCP su un singolo server TCP tramite entrambe le interfacce come mostrato nel diagramma. Ci sono opzioni in Java per collegare l'interfaccia al socket TCP per sovrascrivere la tabella di routing locale?Bind un'interfaccia nella connessione TCP java

Vi allego il diagramma di rete,

network_diagram

vorrei utilizzare sia il link di larghezza di banda di serie per ottenere i dati dal server. Quindi vorrei iniziare la connessione su entrambe le interfacce.

grazie,

+0

Purtroppo, non posso in grado di collegare il diagramma di rete qui. Il mio problema principale è che ho due collegamenti seriali collegati a due router. E i due router sono collegati separatamente al mio host. E vorrei iniziare due connessioni diverse tramite due interfacce. – Mohan

+0

Caricalo da qualche altra parte e collegalo, senza il tuo diagramma è difficile dare una risposta giusta. –

+0

Link alla foto - http://uploadpic.org/v.php?img=vSckl9f6Ze – Mohan

risposta

7

È possibile utilizzare

Socket s = new Socket(hostname, port, localInterface, 0); 

Tuttavia, molti sistemi operativi non onorare questo "suggerimento" e userà la tabella di routing in ogni caso.

+0

Ok, quindi, in pratica è come la parola chiave "register". Os è libero di collegare il socket con questa interfaccia o di collegarlo all'interfaccia predefinita. Se si collega a un'interfaccia diversa, la mia applicazione non funzionerà. Ci sono delle astrazioni disponibili in SocketChannel? – Mohan

+0

Ho letto qualcosa come "SO_BINDTODEVICE" in linux. Ma la classe socketchanneloptions in java non ha "SO_BINDTODEVICE". – Mohan

+0

http://en.wikipedia.org/wiki/Host_model Linux è generalmente ospitato in modo debole e ignorerà l'interfaccia a cui si lega un socket. –

1

Vuoi dire qualcosa di simile:

Socket socket1 = new Socket(); 
socket1.bind(new InetSocketAddress("10.1.1.1", port)); 
socket1.connect(new InetSocketAddress("10.1.3.1", port)); 

Socket socket2 = new Socket(); 
socket2.bind(new InetSocketAddress("10.1.2.1", port)); 
socket2.connect(new InetSocketAddress("10.1.3.1", port); 
+0

No. Il codice precedente non utilizza affatto l'interfaccia e sempre socket1 e socket2 si collegheranno all'interfaccia predefinita. – Mohan

+0

Mi spiace, quanto sopra è quello che cerco di raggiungere .. Ma quanto sopra si collegherà all'interfaccia predefinita che inturn utilizzerà la tabella di routing predefinita. Supponendo che il routing predefinito sia tramite il router B, anche se stabilisco due connessioni socket al server, passerò attraverso lo stesso link. Quindi, se dico che il socket usa l'interfaccia eth1, posso ignorare il routing predefinito e posso usare due collegamenti separati per due socket. – Mohan

+1

In realtà, questo funziona! – Mohan