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

时间:2014-12-02 21:53:14

标签: networking zeromq

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

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

是的,有

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

怎么做?

假设您提供了正式的架构,可行的方法是重新使用称为" 端口敲门"的网络安全技巧。

这个技巧增加了一个"介绍"在公开的 aPortToKnockAt 上进行阶段,之后(在成功满足条件后) - 在您的情况下是第一个要求/已完成{{{ 1}} - 另一个工作端口被私下用于"传输"阶段(在您的情况下,原始端口正在关闭)。

通过这种方式,您的应用程序不会破坏本地端或远程端资源,因为 .connect() 提供了保护孤独原型只能握手的手段,即将到来的尝试找到一个 aPortToKnockAt -ed门(并将远程处理),因此正在实现一种非常有效的被动拒绝。