ZMQ 等待消息,让客户端等待回复
ZMQ wait for a message, have client wait for reply
我正在尝试将 4 个客户端同步到一台服务器。我想在客户端准备好继续前进时向服务器发送一条消息,然后服务器计算它收到的请求数量并向客户端发回一条消息表示它已准备就绪。
到目前为止我所做的是使用 REQ/REP:
while(1){
int responses = 0;
while(responses<numberOfCameras){
for(int i=0; i<numberOfCameras;i++){
cout<<"waiting"<<endl;
if(sockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
responses ++;
cout<<"rx"<<endl;
}
}
}
for(int i=0; i<numberOfCameras;i++){
cout<<"tx"<<endl;
sockets[i]->send("k",1);
cout<<"Sent"<<endl;
}
}
使用多个摄像头时,会产生预期的错误:
Operation cannot be accomplished in current state
因为在回复 REQ 之前它不能做任何事情,对吗?
我如何修改它以适用于多个客户端?
编辑:
我试图用 PUSH PULL 实现一个不太严格的 REQ REP。肉是:
服务器:
while(1){
int responses = 0;
while(responses<numberOfCameras){
for(int i=0; i<numberOfCameras;i++){
cout<<"waiting"<<endl;
if(REQSockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
responses ++;
cout<<"rx"<<endl;
}
}
}
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
for(int i=0; i<numberOfCameras;i++){
cout<<"tx"<<endl;
REPSockets[i]->send("k",1);
cout<<"Sent"<<endl;
}
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}
客户:
for (;;) {
std::cout << "Requesting permission to capture"<< std::endl;
REQSocket.send ("?", 1);
// Get the reply.
zmq::message_t reply;
REPSocket.recv (&reply);
std::cout << "Grabbed a frame" << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(2));
}
我已输出所有端口和地址以检查它们是否设置正确。
服务器程序挂起并输出:
...
waiting
rx
tx
这意味着程序在发送时挂起,但我怎么也看不出为什么
编辑 2:
我制作了一个 github repo 和一个可编译的示例和 linux 生成文件,并再次转换为使用 REP REQ。问题是客户端不接受来自服务器的消息,但同样,我不知道为什么。
答案是在编辑 2 中使用两个 REP REQ 套接字。我在一个变量用法中犯了一个愚蠢的错字 "REQ" 而不是 "REP" 并且没有注意到。因此,我正在连接然后绑定同一个套接字。
我将保留 github 回购,因为我认为这个问题已经足够长了。
我正在尝试将 4 个客户端同步到一台服务器。我想在客户端准备好继续前进时向服务器发送一条消息,然后服务器计算它收到的请求数量并向客户端发回一条消息表示它已准备就绪。
到目前为止我所做的是使用 REQ/REP:
while(1){
int responses = 0;
while(responses<numberOfCameras){
for(int i=0; i<numberOfCameras;i++){
cout<<"waiting"<<endl;
if(sockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
responses ++;
cout<<"rx"<<endl;
}
}
}
for(int i=0; i<numberOfCameras;i++){
cout<<"tx"<<endl;
sockets[i]->send("k",1);
cout<<"Sent"<<endl;
}
}
使用多个摄像头时,会产生预期的错误:
Operation cannot be accomplished in current state
因为在回复 REQ 之前它不能做任何事情,对吗?
我如何修改它以适用于多个客户端?
编辑: 我试图用 PUSH PULL 实现一个不太严格的 REQ REP。肉是:
服务器:
while(1){
int responses = 0;
while(responses<numberOfCameras){
for(int i=0; i<numberOfCameras;i++){
cout<<"waiting"<<endl;
if(REQSockets[i]->recv(requests[i], ZMQ_NOBLOCK)){
responses ++;
cout<<"rx"<<endl;
}
}
}
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
for(int i=0; i<numberOfCameras;i++){
cout<<"tx"<<endl;
REPSockets[i]->send("k",1);
cout<<"Sent"<<endl;
}
boost::this_thread::sleep(boost::posix_time::milliseconds(200));
}
客户:
for (;;) {
std::cout << "Requesting permission to capture"<< std::endl;
REQSocket.send ("?", 1);
// Get the reply.
zmq::message_t reply;
REPSocket.recv (&reply);
std::cout << "Grabbed a frame" << std::endl;
boost::this_thread::sleep(boost::posix_time::seconds(2));
}
我已输出所有端口和地址以检查它们是否设置正确。
服务器程序挂起并输出:
...
waiting
rx
tx
这意味着程序在发送时挂起,但我怎么也看不出为什么
编辑 2: 我制作了一个 github repo 和一个可编译的示例和 linux 生成文件,并再次转换为使用 REP REQ。问题是客户端不接受来自服务器的消息,但同样,我不知道为什么。
答案是在编辑 2 中使用两个 REP REQ 套接字。我在一个变量用法中犯了一个愚蠢的错字 "REQ" 而不是 "REP" 并且没有注意到。因此,我正在连接然后绑定同一个套接字。
我将保留 github 回购,因为我认为这个问题已经足够长了。