【发布时间】:2023-03-21 03:40:01
【问题描述】:
我有两个应用程序。一个是服务器应用程序,另一个是客户端应用程序。服务器应用侦听连接,然后将消息提供给所有连接的客户端。
到目前为止,我的所有测试都是通过在同一台机器上运行两个应用程序来完成的,并且运行良好。现在虽然我正在尝试测试在一台机器上运行的服务器和在另一台机器上运行的客户端。
每台机器都在我自己的家庭网络中。该网络位于带有防火墙的路由器后面。根据我的阅读,我的问题可能与我的路由器上未设置端口转发有关。听起来可能吗?
我可以用我的代码解决这个问题吗?我真的必须要求所有用户手动打开防火墙上的端口吗?我使用了许多其他连接到服务器的商业应用程序,并且不需要我在防火墙上打开端口。这些应用程序和我的有什么不同?
再一次,也许我在这里叫错了树。也许还有其他问题阻止我的代码在这种情况下工作?
我可以提供任何可能有帮助的代码 sn-ps,但我不确定从哪里开始寻找,我不想只发布我的整个解决方案 :)
提前谢谢你
【问题讨论】:
-
这与你的路由器无关。您必须绑定到服务器上的外部地址(例如 192.168.1.X 或 INADDR_ANY (0.0.0.0))并使用客户端连接到该机器的外部 IP 地址。
-
我的服务器已经完成了绑定。它最终绑定到特定的 IPv6 地址。我的客户能够连接两种方式中的一种;到那个特定的 IPv6 地址或服务器机器的主机名。当客户端应用程序在服务器机器上运行时,两者都可以工作。但是,当应用程序位于同一网络中的不同 PC 上时,两者都不起作用。我认为那个特定的 IPv6 地址可能是一个本地 IP。你认为这可能是问题所在?
-
@SnapGames:能否请您发布您的绑定地址?
-
Mauve,我的代码调用 getaddrinfo。在这种情况下,有 4 个结果:fe80::d5b5:6efd:37a8:39e8%11、fe80::38fe:3fae:3f57:fe92%12、192.168.1.109 和 2001:0:4137:9e76:38fe:3fae :3f57:fe92。然后我的代码循环遍历这些代码,直到它能够成功绑定到一个以进行收听。同样,在这种情况下,它最终成功绑定到第一个,所以它就在那里结束。
-
我发现如果我绑定到 IPv4 地址,那么一切正常。我觉得这很奇怪,因为两台机器都有支持 IPv4 的网络设备。也许我的路由器不支持 IPv4?它很老了。无论哪种方式,我想正确的解决方案是绑定到 getaddrinfo 的所有结果(在本例中为 4 个)?
标签: c++ c sockets networking