将套接字连接到环回远程端点,同时绑定到LAN源地址

时间:2014-01-02 16:15:36

标签: c# .net unit-testing sockets bind

我正在寻求一些帮助,以了解如何将出站套接字连接到127.x.x.x环回子网上的目标IP,同时绑定到分配给本地计算机的“真实”IP。

我无法将套接字绑定到本地端点10.0.0.1(工作站唯一的非环回IPv4地址)并连接到地址为127.4.5.6的“远程”服务器(正在侦听)。我看到winsock错误10049(WSAEADDRNOTAVAIL)和.net框架呕吐“请求的地址在其上下文中无效127.4.5.6:50000”

详情。

我有一个连接到远程服务器的本地套接字。我必须将套接字的源地址绑定到特定的本地地址。这是因为运行套接字的计算机可能有许多可用的地址,但只有一个源IP地址正确NAT,以便远程服务器信任它。我无法将本地套接字绑定到任何旧的本地地址,因为O / S可能会选择一个不是NAT的,因此远程服务器不喜欢源地址。

从功能上来说,一切正常。

我正在尝试进行单元测试。由于无法模拟和子类化套接字,因此我的单元测试会生成一个充当远程服务器的本地EXE,侦听特定的环回地址(在命令行参数中定义),如127.4.5.6。然后,我可以将我的主程序连接到“远程”地址127.4.5.6,而源绑定到127.1.2.3。一切正常。

但我想进行更改以允许虚假服务器(EXE)仍然在127.4.5.6上侦听,同时强制被单元测试的出站套接字本地绑定到10.0.0.1(工作站的LAN IP)而不是127.1.2.3。 Windows不喜欢它 - 它抛出一个Winsock 10049错误,说该地址在其上下文中无效。

如何在本地绑定到常规LAN地址的本地端点时连接到环回地址的远程端点?

由于

1 个答案:

答案 0 :(得分:0)

我之前在微软论坛上问过这个问题。这种情况发生在微软的新TCPIP实施中(所有操作系统上的IPv6,以及Vista上的IPv4和后者)。 环回到非环回应该可以在XP over IPv4上正常工作。

有关Microsoft的解释,请参阅why can't we connect to loopback address from non loopback addresses anymore?

相关问题