如何让我的 ZeroMQ 应用程序拒绝其他连接



我有一个C++ 0MQ应用程序,它执行bind()并使用PUSH套接字发送消息。我想确保这些消息发送到不超过一个客户端。

有没有办法只允许一个客户端.connect(),然后拒绝来自所有后续客户端的连接?

如果您的服务器应用程序使用 ROUTER 套接字而不是 PUSH,则它可以更好地控制连接。每条消息的第一帧包含发件人的 ID,因此服务器可以专门处理一个连接。

为了使这项工作,协议必须比简单的PUSH/PULL复杂一些。一种方法是将连接设置为DEALER套接字,其第一个操作是向服务器发送"我在这里"消息。然后,服务器知道连接的 ID,并专门处理第一个连接。任何其他连接都可以通过向其他连接发送"你不应该在这里"消息来拒绝,当然,他们必须理解并通过断开自己的连接来采取行动。

在第一条"我在这里"消息之后,客户端不需要再发送任何消息。他们可以坐在那里等待来自服务器的消息,与PUSH/PULL完全相同。

是的,有

虽然真正的 ZeroMQ 消息传递框架具有许多内置功能,但它允许集成额外的抽象层,这可以解决您的任务和许多其他特定于自定义的需求。因此,不要担心没有直接的 API 调用来执行您需要的操作。

怎么办?

假设给出了正式的架构,可行的方法是重用称为">端口敲击"的网络安全技巧。

这个技巧在一个公开的aPortToKnockAt上增加了一个"引入"阶段,之后(在成功满足条件后——在你的情况下是第一个要求/完成.connect()的客户——另一个工作端口正在私下用于"运输"阶段(在你的情况下,原始端口正在关闭(。

这样,您的应用程序就不会破坏本地端或远程端资源,aPortToKnockAt因为它提供了保护孤子原型的方法,只有握手和即将到来的敲门尝试只会找到一个.close()的门(并将远程处理(,因此正在实现一种非常有效的被动拒绝。

最新更新