服务器绑定到端口#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;
}
答案 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代码的情况,也没有进一步转移问题方向的情况。
永远不要问“(代码请)”