确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?相关的知识,希望对你有一定的参考价值。

服务器绑定到端口#s上的两个套接字:6666(用于服务来自客户端的SMS发送请求)和6661(用于服务来自客户端的EMAIL发送请求)。

由于我想以不同的方式为它们提供服务,我必须首先知道请求来自哪个端口,以便我可以为该服务执行代码。

所以,我的问题是如何识别端口?

如果这是不可能的,那么可以应用什么逻辑来解决这个问题呢?

服务器端代码是:

int main () {

zmq::context_t context (1);               // Prepare our context and socket

zmq::socket_t socket  (context, ZMQ_REP); socket.bind  ("tcp://*:6666");
zmq::socket_t socket2 (context, ZMQ_REP); socket2.bind ("tcp://*:6661");

while (true) {      
  // ----------------------------------SMS CODE----------------------------------
     zmq::message_t request;
     socket.recv ( &request);             // Wait for next request from client

  /* ...                                  // SMS Send Logic
     ...
                                          */
     zmq::message_t reply (11);           // Send reply back to client
     memcpy (reply.data (), "SMS Details", 11);
     socket.send (reply);

  // --------------------------------EMAIL CODE----------------------------------
     zmq::message_t request2;
     socket2.recv (&request2);            // Wait for next request from client

  /* ...                                  // Email Send Logic
     ...                           
                                          */
     zmq::message_t reply2 (16);          // Send reply back to client
     memcpy (reply2.data (), "Email Details", 16);
     socket2.send (reply2);
  }                                       // end of while
return 0;
}
答案

在尝试从中读取之前,您应该使用zmq::poll来检查哪些套接字具有待处理的消息。有一个官方的cpp例子here

您也可以使用ZMQ_DONTWAIT来检查消息,但仍应轮询以避免使用过多的CPU。

例:

#include "zeromq.hpp"

int main (int argc, char *argv[])
{
    zmq::context_t context(1);

    zmq::socket_t emailSocket  (context, ZMQ_REP); emailSocket.bind  ("tcp://*:6666");
    zmq::socket_t smsSocket (context, ZMQ_REP); smsSocket.bind ("tcp://*:6661");

    //  Initialize poll set
    zmq::pollitem_t items [] = {
        { emailSocket, 0, ZMQ_POLLIN, 0 },
        { smsSocket, 0, ZMQ_POLLIN, 0 }
    };
    //  Process messages from both sockets
    while (1) {
        zmq::message_t message;
        // wait until there is a message ready for one of the sockets
        zmq::poll (&items [0], 2, -1);

        // try to read/process a message from email socket (Don't wait, just skip if there are none)
        if (emailSocket.recv(&message, ZMQ_DONTWAIT)) {
            //  Process email request
            zmq::message_t response(...);
            emailSocket.send(&response);
        }
        // same again for sms socket
        if (smsSocket.recv(&message, ZMQ_DONTWAIT)) {
            //  Process sms request
            zmq::message_t response(...);
            smsSocket.send(&response);
        }
        // back to the top of the loop to wait for another message
    }
    return 0;
}
另一答案

让我们揭开问题的神秘面纱并清理代码

代码主要是错误的,不会编译(检查不匹配的卷曲括号)。

接下来你的代码与你的文字说明不符(检查交换的端口号码文本说6666用于电子邮件,而代码实现了这个用于SMS处理)。

最后,即使是经过纠正的代码也不会非常强大,不会陷入相互的,主要是不可救的死锁(在StackOverflow或其他地方更多地了解这个in many other posts be it here)。


然而,问题是要求检测端口号。

鉴于.bind()方法中分配的端口号已经将这对ZeroMQ-socket实例分离地映射到不同的端口#-s上,对消息到达没有任何疑问,socket-instance { socket | socket2 }已经到达这样的消息。

鉴于此,所有SMS指定的消息都来自端口6666

鉴于此,将有所有MAIL指定的消息来自端口6661(除非发生了一些发送方意图的sabbotage,但这超出了问题的范围,不是吗?)

  • 我的问题是我们将如何根据请求的端口号有选择地运行SMS或EMAIL代码。@ user3666197 - Ayush Bajaj 32分钟前?

否定,先生,您的问题是“如何识别港口?” - 即如何在语法和语义设计中检测端口#,而代码主要是错误的。

  • 语法错误已删除。我知道代码进入死锁状态。这可以通过运行SMS或EMAIL代码来避免,具体取决于请求所在的端口。 - Ayush Bajaj 21分钟前

负面的,先生,您的代码设计建议使用命令式的纯[SERIAL]计划进入阻塞等待状态,首先期望从SMS入口访问端口#:6666读取,当且仅当这确实发生在一段时间内未来(永远不会保证确实发生),代码然后可以进入下一个(再次阻塞)等待状态并继续等待,直到一些(如果有的话)EMAIL-ingress消息(希望)到达。

  • 你写道“对消息的到来毫无疑问,socket-instance {socket | socket2}这样的消息已经到来了。”你怎么知道请求到达哪个端口(代码请),以便相应我们可以服务 - Ayush Bajaj 17分钟前

(代码请)?!? 您是否要求其他人完成工作并编写解决方案?

对不起,这不是任何志愿者网站。

如果您已将问题从“如何识别端口?”中移除?为了坚持别人的订单,如(cit。:)“Code please”,请重新阅读有关使用poll()的ZeroMQ API文档并正确完成工作,而不要求其他人。

StackOverflow社区热衷于帮助解决问题,这些问题是用MCVE制定的,但是没有,但MCVE代码片段确实代表了先前研究和设计+调试工作的有力证据,显然不是O / P代码的情况,也不是进一步转移问题方向的情况。

永远不要问“(代码请)”

以上是关于确定REQ-REP ZeroMQ应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?的主要内容,如果未能解决你的问题,请参考以下文章

ZMQ通信模式:REQ-REP模式

为啥套接字连接的基本抽象并不常见?

ZMQ源码分析--ROUTER-DEALER & REQ-REP

javascript客户端中的ZeroMQ

zeromq:如何防止无限等待?

实时聊天,不想丢消息——用队列(redis、zeromq)?