【问题标题】:Integrate boost-asio with file descriptor based socket api from KDB+将 boost-asio 与来自 KDB+ 的基于文件描述符的套接字 api 集成
【发布时间】:2019-07-21 17:41:04
【问题描述】:

我对 boost-asio 比较陌生,我想知道是否可以使用 KDB+ api here

我尝试了类似下面的方法,但它似乎无法正常工作,

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <boost/bind.hpp>

#define KXVER 3

#include "kx/k.h"

using boost::asio::ip::tcp;
namespace posix = boost::asio::posix;

class Feedhandler
{
public:
    Feedhandler(boost::asio::io_service &io_service) : m_qsvc(io_service) {

        char host[] = "localhost";
        int port = 6812;

        m_fd = khpu(host, port, "user:pass");
        m_qsvc.assign(m_fd);

        start_operations();

        K ret = k(m_fd, ".u.sub", ks(""), ks(""), (K)0);

    }

    void start_operations()
    {
        boost::asio::async_read(m_qsvc, boost::asio::null_buffers(),
                                boost::bind(&Feedhandler::handle_read, this, boost::asio::placeholders::error,
                                            boost::asio::placeholders::bytes_transferred));

    }

    void handle_read(const boost::system::error_code& error, size_t size)
    {
        K data = k(m_fd,(S)0);
        start_operations();
    }


private:
    int m_fd;
    posix::stream_descriptor m_qsvc;

};

int main(int argc, char* argv[])
{

    boost::asio::io_service io_service;

    Feedhandler fh(io_service);

    io_service.run();

    return 0;
}

handle_read 方法被点击一次,随后不再有回调。

【问题讨论】:

  • 不再回拨是什么意思?您的意思是未调用读取处理程序吗?它通常在 FD 准备好读取时调用,您确定 FD 已准备好读取,但处理程序没有执行?在分配 FD 并启动 io_context 的事件循环的情况下......我看不出有任何缺陷。
  • 查看了您的 api(从未听说过 KDB),它看起来像 ` k(m_fd, ".u.sub", ks(""), ks(""), (K)0 );`函数是用来发送消息的...在上面的代码中,看起来Feedhandler的构造函数中只有一个调用,你确定m_fd发生了写入吗?跨度>
  • 简而言之:我只看到一封写信给m_fd
  • 我的意思是handle_read只被调用了一次,并且该调用中有有效数据,但随后没有其他调用。 KDB api 使得 k(m_fd, ".u.sub", ks(""), ks(""), (K)0) 是一个订阅调用,它只需要被调用一次。 subscribe调用后,我们只需要检查文件描述符是reading for reading,重复调用data = k(m_fd,(S)0),就会返回发布的数据。
  • 谁在给那个 FD 写信?你如何确定写入正在发生?

标签: boost-asio


【解决方案1】:

实际上,最好使用 async_wait 而不是 async_read,如下所示,

m_qsvc.async_wait(boost::asio::posix::stream_descriptor::wait_read, 
   boost::bind(&Feedhandler::handle_read, this, boost::asio::placeholders::error) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2014-04-25
    相关资源
    最近更新 更多