select套接字输出接口:SO_BINDTODEVICE vs绑定之前连接

我试图在两个接口的系统上设置套接字的输出接口。 我GOOGLE了很多,我发现不同的答案。 有人说,我可以在connect之前bind一个套接字来select一个特定的接口(如在一个套接字如何知道使用哪个networking接口控制器? )。 但其他人认为这是不够的(如在http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html或如何打开特定接口上的套接字,并接收IPv4和IPv6交通 )。

我有一个使用SO_BINDTODEVICE的工作实现。 但是, connect解决scheme之前的bind不起作用。 似乎源地址不影响路由,在这种情况下只考虑路由表。 有人说这是由于Linux的弱端系统模型造成的。 根据http://wiki.treck.com/Appendix_C:_Strong_End_System_Model_/_Weak_End_System_Model ,源地址不指定输出接口。

如果可能的话,我想有一个便携式的解决scheme。 我知道SO_BINDTODEVICE只在Linux中可用。

源地址不影响数据包的路由。 接口将根据目的地址和主机的路由表进行选择。 你可以用route命令修改它。

 route default gw [gateway IP] 

无论套接字绑定到哪个接口,数据包都将根据路由表进行路由。 套接字绑定到的接口将决定源IP地址。

现在,我运行了一些绑定到回送接口的测试,并将套接字连接到Internet中的其他地址,在这种情况下,连接失败,错误号为22(EINVAL)。 然而,在其他两个接口(没有回环)和连接到Internet服务器的测试中,无论我将哪个接口绑定到该接口,数据包都是根据路由表发送出去的,在我的情况下是默认的规则。 源地址取决于绑定。