簡體   English   中英

在 zeromq REQ/REP 上收到 EAGAIN 而不阻塞套接字

[英]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 來查看它是否失敗,錯誤號僅在連接失敗時才有效。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM