【发布时间】: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