Windows下同时支持多个网络连接(Multi-Homed, Multi-Cast)?
在编程的时候,我们可能碰到需要处理多个网络连接的情况,例如两个拨号网络,我们可以分别走不同的连接来上网,Windows本身是不支持的。但我们可以利用以下的方法来实现:
1:修改Windows的路由表来实现指定的路由。
2:在Socket绑定的时候,绑定网关即可。
原理:
Windows的每个网络接口有一个Metric,也就是接口跃点数,其含义是,可以手动给某个连接,设定其中间经过的代理或者网关的个数,目的是让Windows自动选定一个比较快的网关来传输数据,但Windows在实际上引用的时候,默认是第一个的网络连接跃点数为1,后来拨号的接口的跃点数会变化,也就是变成2或者其他的数值,这样Windows在多个网络连接后,总是使用Metric为1的网络连接来传输数据!实际上,对本机器来说,多个拨号网络连接后,其Metric都是一样的,都应该为1,因此我们修改这个路由表,把Metric都改成1,这样Windows就能够选择路由的时候,把所有连接同优先级对待了。当然这样还是不够的,因为Windows还无法区分该利用那个网络连接来传输数据。因此我们在Bind Socket的时候,需要指定一个默认的网关,这样一旦Socket建立成功,对所有Metric相同的连接,Windows总是使用默认的网关来传输数据,也就是达到可以同时支持多个网络的目的了。
具体代码如下:
在拨号网络连接建立之后,首先获取该拨号的公网IP地址和网关地址,然后调用
route add 0.0.0.0 mask 0.0.0.0 网关地址 metric 1
在绑定Socket的时候,请务必指定绑定的IP地址和网关,这样就能够同时支持多个网络连接了。
在Linux平台,可以直接绑定的时候指定网卡或网络接口,完全可以独立传输,并不用这么麻烦的。