【问题标题】:ZeroMQ Poll - Resource temporarily unavailableZeroMQ 轮询 - 资源暂时不可用
【发布时间】:2018-02-19 17:04:01
【问题描述】:

我正在尝试运行一个小型 ZeroMQ 应用程序。
我正在使用 Ubuntu 机器,我的代码中还使用了 QT 框架。
首先,我创建了一个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 版本吗?
  • 对于不完整的信息,我深表歉意。 ZeroMQ 版本是:4.1.4-7

标签: c++ zeromq


【解决方案1】:

在 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 结构中使用,所以不要犹豫。

【讨论】:

  • 感谢您的信息,我们希望这种方法可以解决问题吗?还是只是建议?我试过了,但问题并没有消失。 @user3666197
  • 这是首先要做的,这样才能满足API文档化的状态。如果您之前的测试留下了挂起的上下文实例,端口# 可能仍然被阻塞,但是这些多米诺骨牌效应的事情远远超出了发布的用例(没有额外的错误检测/补救策略存在)。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-02-21
  • 2018-08-04
  • 2021-05-07
  • 2018-02-24
  • 2016-01-25
  • 2012-04-25
  • 2018-03-11
  • 1970-01-01
相关资源
最近更新 更多