【发布时间】:2017-03-22 10:18:22
【问题描述】:
当我从此处找到的 ZeroMQ 指南中用 C++ 创建 Hello World 示例时: http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-Receive
并运行应用程序,我收到一个 Windows 安全警报,询问我是否允许应用程序在公共网络或专用网络上通信。
看起来像这样:
这里是有趣的地方。
我只需要我的程序在端口 5555 上侦听来自本地主机的连接,我确实不需要允许端口 5555 上的传入连接。这是因为我只想在本地主机上的应用程序之间进行通信.
客户端和服务器都在同一台机器上运行。
这是我目前的流程。我启动服务器,出现 Windows 安全警报,因为我以非管理员帐户运行应用程序,所以我只有标准权限。然后我点击警报上的取消。
单击警报上的取消会在 HelloWorldServer.exe 的所有端口上明确拒绝入站规则。这完全没问题。
然后我启动客户端。由于客户端正在连接到本地主机。我实际上不需要在本地机器之外发送消息,它的所有消息都可以到达服务器。
鉴于对 HelloWorldServer.exe 传入连接的明确拒绝规则,消息仍然可以从本地主机上的客户端到达。这是一个理想的结果。
现在问题变成了是否自动响应 Windows 安全警报以单击取消?由于不需要允许,有什么方法可以阻止它弹出?
提示是不可取的,因为它暗示应用程序需要创建漏洞,而实际上它没有。
请假设命名管道不是 tcp 作为进程间通信手段的有效替代方案。
【问题讨论】:
-
监听socket是怎么绑定的?即使您打算仅在未正确绑定的情况下将套接字与本地主机一起使用,它也将允许远程连接并触发防火墙。这里有一篇有用的文章:understanding INADDR_ANY for socket programming - c
-
socket.bind ("tcp://*:5555");完整示例位于zguide.zeromq.org/cpp:hwserver -
*表示允许任何本地或远程地址的可能性很大。尝试将socket.bind ("tcp://localhost:5555");或socket.bind ("tcp://127.0.0.1:5555");绑定到本地流量。 -
localhost 会导致运行时错误,因为 ZeroMQ 需要一个地址。但是,使用 127.0.0.1 允许程序以标准权限运行,而无需尝试创建防火墙规则。成功!非常感谢您的建议。做出回答,我会接受的。
标签: tcp port ipc zeromq windows-firewall