Socket.Bind
(在执行Connect
之前)通过两个NIC启动传出TCP连接到每个相关NIC的IP地址。第一个NIC工作正常,但对于第二个NIC,我得到SocketException
:“尝试对无法访问的网络进行套接字操作”。
我最初的理解是,由于套接字绑定到具有其网关定义的具体NIC的本地端点,因此连接应该路由到此网关,因此应该可以工作。但是,似乎忽略了源IP地址,并且路由根据本地路由表工作(即第二个NIC的连接请求转到第一个,默认,网络并被拒绝,因为它有错误的子网)。
调整本地路由表有所帮助,但它让我想知道套接字绑定到特定本地IP的能力背后的整个推理。
做一些额外的阅读,我发现确实存在“源IP路由”这样的事情,但是由于安全原因,默认情况下在Windows中禁用它(通过DisableIPSourceRouting
注册表设置)例如,描述这里:
问题:
Socket.Bind
应该足够了) - 为什么没有修改路由表就无法工作?Socket.Bind
被忽略并且使用了路由) - 那么拥有Socket.Bind是什么意思?为什么要这样做呢?非常感谢。
答案 0 :(得分:4)
好的,经过一些阅读,这里有一些关于正在发生的事情的高级解释。我仍然需要在我的系统中验证以下结论。显然,选择网络接口时通常会忽略本地绑定。相反,路由表用于此目的。但是,在强主机模型(默认情况下为Vista及更新版本,XP中不存在)中,源IP 在路由表查找中用作“约束”。< / p>
关于强主机模型与弱主机模型的简要说明: http://technet.microsoft.com/en-us/magazine/2007.09.cableguy.aspx
有关上述内容与XP较新的Windows版本有什么不同的说明: http://blogs.technet.com/b/networking/archive/2009/04/24/source-ip-address-selection-on-a-multi-homed-windows-computer.aspx