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

时间:2018-03-01 06:21:38

标签: c++ server port 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;
}

2 个答案:

答案 0 :(得分:1)

在尝试从哪些套接字读取之前,您应该使用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;
}

答案 1 :(得分:0)

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

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

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

最后,即使是经过纠正的代码也不会非常强大,不会陷入共同且主要是不可救助的死锁(在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。:) 代码 ”,请重新阅读有关使用 poll() 的ZeroMQ API文档并正确完成工作,不要求别人去。

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

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