[英]ZeroMQ FiniteStateMachineException in REQ/REP pattern
[英]EAGAIN received on zeromq REQ/REP without blocking socket
我正在恢復一個建立在 zeromq 上的三年前的項目。
在編寫代碼時(在 ubuntu 14.04 上),代碼正在運行(據我所知)。 現在(ubuntu 16.04 和 libzmq.so.5)代碼可以編譯,但是 zeromq 通信出了點問題,這讓我很抓狂。
zeromq部分是我寫的,所以我對代碼很了解,也許這就是我看不到錯誤的原因。
服務器端代碼相當復雜,但我盡量堅持相關部分:
WorkerServer::WorkerServer(){
address="tcp://*:4321";
justreceived=-1;
bind();
}
void WorkerServer::bind(){
actual_socket=server_socket();
actual_socket->bind(address.c_str());
std::cout << "I: server listening on " << address.c_str() << std::endl ;
}
static zmq::socket_t* server_socket(){
static zmq::context_t context(1);
return new zmq::socket_t(context, ZMQ_REP);
}
初始化后,服務器開始無限循環,調用以下代碼行:
int rc=actual_socket->recv(&message);
if(rc!=0){
std::cout << "E: socket error number " << errno << " (" << zmq_strerror(errno) << ")" << std::endl;
}else{
std::cout << "I: received message" << std::endl ;
}
當我第一次編譯它時,我開始只收到 EAGAIN 錯誤並且沒有任何工作。 所以,我寫了兩個簡單的客戶端,第一個用 C++,第二個用 Python。
第一個 (C++)在客戶端上生成此錯誤:
E:連接失敗,錯誤 11(資源暫時不可用)
第二個 (Python)在服務器上生成此錯誤:
E:socket error number 11(資源暫時不可用)
但客戶實際上收到了答復。
這是python代碼:
#!/usr/bin/python
import zmq
import sys
port = "4321"
context = zmq.Context()
print "Connecting to server..."
socket = context.socket(zmq.REQ)
socket.connect ("tcp://localhost:%s" % port)
if len(sys.argv) > 2:
socket.connect ("tcp://localhost:%s" % port1)
# Do 10 requests, waiting each time for a response
for request in range (1,10):
print "Sending request ", request,"..."
socket.send ("Hello")
# Get the reply.
message = socket.recv()
print "Received reply ", request, "[", message, "]"
這是 C++ 代碼:
#include <string>
#include <vector>
#include <iostream>
#include "msgpack.hpp"
#include "unistd.h"
#include "cxxabi.h"
#include "zmq.hpp"
main(){
std::string server_name("tcp://localhost:4321");
static zmq::context_t context(1);
std::cout << "I: connecting to server " << server_name << " with context " << (void*)(context) << std::endl;
zmq::socket_t * client = new zmq::socket_t (context, ZMQ_REQ);
std::cout << "I: created client " << (void*)(client) << " with errno " << errno << std::endl;
sleep(1);
client->connect (server_name.c_str());
if(errno!=0){
std::cout << "E: connect failed with error " << errno << " (" << zmq_strerror (errno) << ")" << std::endl;
exit(1);
}
}
任何的想法? 我不明白為什么這不起作用以及為什么 python 和 c++ 之間存在如此大的差異。
更新:
正如@James Harvey 所指出的,這段代碼有效......:
try{
std::cout << "Connecting..." << std::endl;
client->connect (server_name.c_str());
zmq::message_t request (5);
memcpy (request.data (), "Hello", 5);
std::cout << "Sending Hello " << std::endl;
client->send (request);
}catch(std::exception& e){
std::cout << "E: connect failed with error " << e.what() << std::endl;
}
我在想,因為 zmqpp 是建立在 C 綁定上的,所以測試 errno 或捕獲異常是一樣的。 事實上,事實並非如此。
在您的 C++ 代碼中,您是否使用了 cppzmq 綁定? 如果是這樣,您應該在連接上使用 try/catch 來查看它是否失敗,錯誤號僅在連接失敗時才有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.