2017-04-13 8 views
1

私は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のためのテストや例外をキャッチすることは同じでした。 実際、そうではありません。

答えて

1

あなたのC++コードでは、cppzmqバインディングを使用していますか?そうであれば、接続にtry/catchを使用して失敗したかどうかを確認する必要があります。接続が失敗した場合にのみerrnoが有効です。

https://github.com/zeromq/cppzmq/blob/master/zmq.hpp#L603

+0

いいえ、あなたはまったく正しいです。このコードの動作: { 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

関連する問題