2012-07-13 78 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