私はzeromqで構築された3年前のプロジェクトに復帰しています。EAGAINはソケットをブロックせずにREQ/REPを受信しました
コードは(ubuntu 14.04上で)書かれた瞬間に(私が知っている限り)動作していました。今(ubuntu 16.04とlibzmq.so.5)コードがコンパイルされますが、何かzeromqの通信に間違っています。これが私を狂ってしまいます。
zeromqの部分が私によって書かれていたので、私はコードをよく知っていました。そしておそらくこれがエラーを見ることができないのです。
サーバー側のコードは非常に複雑ですが、私は、関連する部分に固執しよう:
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 ;
}
:
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);
}
は、初期化後、サーバはこれらのコード行を呼び出す無限ループを開始します
初めてコンパイルしたとき、私はEAGAINエラーだけを受信し始めましたが、何も動作していませんでした。 したがって、私は2つのシンプルなクライアントを書いています。最初のものはC++で、もう1つはPythonで書かれています。
E: connect failed with error 11 (Resource temporarily unavailable)
2つ目(Pythonの)サーバにこのエラー発生:
E: socket error number 11 (Resource temporarily unavailable)
しかしを
最初の(C++)は、クライアントでこのエラーをを生成しますクライアントは実際ににの返信を受け取ります。
これは、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++の間にこのような違いがあるのか分かりません。
UPDATE:
@Jamesハーヴェイで指摘したように、このコードは動作します...:
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のためのテストや例外をキャッチすることは同じでした。 実際、そうではありません。
いいえ、あなたはまったく正しいです。このコードの動作: { std :: cout << "接続中..." << std :: endl; クライアント - >接続(server_name.c_str()); zmq :: message_t request(5); memcpy(リクエスト。データ()、 "Hello"、5); std :: cout << "Helloを送信する" << std :: endl; client-> send(request); } catch(std :: exception&e){ std :: cout << "E:接続がエラーで失敗しました" << e.what()<< std :: endl; } – d3k