簡體   English   中英

ZeroMQ投票-資源暫時不可用

[英]ZeroMQ Poll - Resource temporarily unavailable

我正在嘗試運行一個小的ZeroMQ應用程序。
我正在使用在我的代碼中使用QT框架的Ubuntu計算機工作
首先,我創建一個test_class 此類創建套接字和上下文,而不是建立連接。
這是我的測試課:

頭文件:

class test_class
{
public:
    test_class();
    ~test_class();

    zmq::socket_t* get_conn_socket() const;
    void establish_connection();

private:
    zmq::context_t * m_context;
    zmq::socket_t * m_socket;
};

源文件 :

#include "test_class.h"

test_class::test_class()
{
    m_context = new zmq::context_t(1);
    m_socket = new zmq::socket_t(*m_context, ZMQ_DEALER);
}

test_class::~test_class()
{

}

zmq::socket_t* test_class::get_conn_socket() const
{
    return m_socket;
}

void test_class::establish_connection()
{
    m_socket->connect("tcp://localhost:9999");
}

在主代碼中,我創建一個test_class實例並使用該實例建立連接。 然后等待來自代理的消息。

qDebug() << "TEST CODE WORKING";

int mtime = 1000;
test_class *test = new test_class();
test->establish_connection();

s_send(*(test->get_conn_socket()), "READY");

while(true)
{
    zmq::socket_t* temp_socket = test->get_conn_socket();
    zmq::pollitem_t items[] = { { *temp_socket, 0, ZMQ_POLLIN, 0} };
    if( zmq_poll(items, 1, mtime) > 0)
    {

        qDebug() << "ZMQ_POLL_IN";

        if ( items[0].revents & ZMQ_POLLIN )
        {
            zmsg msg(*temp_socket);

            if(strcmp(msg.body(), "HEARTBEAT") == 0)
            {
                qDebug() << "HEARTBEAT message";
            }
            else
            {
                qDebug() << "SOME OTHER message";
            }
        }
    }
    else
    {
        qDebug() << zmq_strerror(errno);
    }


    s_send(*temp_socket, "HEARTBEAT");

}

最后,
我的test_class輸出是這樣的:

Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 
Resource temporarily unavailable 

broker_code輸出是:

HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER
HEARTBEAT MESSAGE COME FROM WORKER

當我使用tcpdump檢查代理代碼與我的代碼之間的通信時,tcpdump的輸出如下所示:

19:58:37.815283 IP localhost.9999 > localhost.39278: Flags [.], ack 33, win 342, options [nop,nop,TS val 3575439312 ecr 3575439312], length 0
19:58:38.816456 IP localhost.39278 > localhost.9999: Flags [P.], seq 33:44, ack 1, win 342, options [nop,nop,TS val 3575440313 ecr 3575439312], length 11
19:58:38.816475 IP localhost.9999 > localhost.39278: Flags [.], ack 44, win 342, options [nop,nop,TS val 3575440313 ecr 3575440313], length 0
19:58:39.817500 IP localhost.39278 > localhost.9999: Flags [P.], seq 44:55, ack 1, win 342, options [nop,nop,TS val 3575441315 ecr 3575440313], length 11

因此,似乎經紀人向我發送了一條消息。 但是,為什么我的test_class無法識別消息? 為什么出現“資源暫時不可用”錯誤?

在最新版本的ZeroMQ中,API文檔明確建議使用(void *)強制轉換ZeroMQ套接字類型。

zmq::pollitem_t items[] = { { (void *) temp_socket, // void *ZeroMQ Socket
                                                 0, // int   <fd>
                                        ZMQ_POLLIN, // short  EVENTS
                                                 0  // short REVENTS
                              }
                            };

以便正確地“安置”並在zmq_pollitem_t結構中使用,因此請不要猶豫。

暫無
暫無

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

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