【发布时间】:2014-01-02 16:15:35
【问题描述】:
我正在寻求一些帮助,以了解如何将出站套接字连接到 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,以便远程服务器信任它。我无法将本地套接字绑定到任何旧的本地地址,因为操作系统可能会选择一个不是 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 地址的本地端点时,如何连接到环回地址的远程端点?
谢谢
【问题讨论】:
标签: c# .net unit-testing sockets bind