确定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应用程序客户端发出请求的端口,服务器绑定到两个端点(端口号)?的主要内容,如果未能解决你的问题,请参考以下文章