2012-07-13 77 views
6

我在solaris主機中有兩個接口。我想通過兩個接口啓動兩個到單個TCP服務器的TCP連接,如圖所示。 Java中是否有任何選項將接口綁定到TCP套接字以覆蓋本地路由表?在java TCP連接中綁定一個接口

我附上了網絡圖,

network_diagram

我想用兩個串行鏈路的帶寬從服務器獲取數據。因此我想在這兩個接口上啓動連接。

感謝,

+0

不幸的是,我能不能在這裏附上網絡圖。我的主要問題是我有兩個串行鏈路連接到兩個路由器。兩臺路由器分別連接到我的主機。我想通過兩個接口啓動兩個不同的連接。 – Mohan 2012-07-13 12:27:54

+0

將它上傳到其他地方並鏈接,沒有你的圖表,這很難給出正確的答案。 – 2012-07-13 12:29:26

+0

鏈接到圖片 - http://uploadpic.org/v.php?img=vSckl9f6Ze – Mohan 2012-07-13 12:32:05

回答

7

您可以使用

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

然而,許多操作系統不孝敬這個「提示」,將反正使用的路由表。

+0

好的,所以,基本上它就像「註冊」關鍵字。 O可以自由地將套接字與該接口綁定或綁定到默認接口。如果它綁定到不同的接口,那麼我的應用程序將無法工作。 SocketChannel中是否有可用的抽象? – Mohan 2012-07-13 13:22:43

+0

我在linux中讀了類似「SO_BINDTODEVICE」的內容。但是java中的socketchanneloptions類沒有「SO_BINDTODEVICE」。 – Mohan 2012-07-13 13:27:27

+0

http://en.wikipedia.org/wiki/Host_model Linux通常是弱託管的,並且將忽略您將Socket綁定到哪個接口。 – 2012-07-13 13:47:28

1

你的意思是這樣的:

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

否。上述代碼根本不使用接口,並且始終將您的套接字1和套接字2綁定到默認接口。 – Mohan 2012-07-13 13:24:38

+0

對不起,以上是我試圖達到..但上面將連接到默認的接口,它將使用默認的路由表。假設默認路由是通過路由器B,雖然我建立了兩個到服務器的套接字連接,但我將通過相同的鏈接。所以,相反,如果我說套接字使用接口eth1,我可以繞過默認路由,並可以爲兩個套接字使用兩個單獨的鏈接。 – Mohan 2012-07-13 13:53:45

+1

其實,這個工程! – Mohan 2012-08-01 12:49:14