【问题标题】:Connect socket to loopback remote endpoint while bound to LAN source address将套接字连接到环回远程端点,同时绑定到 LAN 源地址
【发布时间】: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


    【解决方案1】:

    我之前在微软论坛上问过这个问题。这发生在 Microsoft 的新 TCPIP 实现上(所有操作系统上的 IPv6,以及 Vista 和更高版本上的 IPv4)。 环回到非环回应该可以在 XP over IPv4 上正常工作。

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

    【讨论】:

      猜你喜欢
      • 2017-04-27
      • 2012-06-15
      • 2015-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 2022-06-01
      • 2010-12-26
      相关资源
      最近更新 更多