Boost-ASIO async_receive_from函数重载问题(+动态指针)

时间:2018-02-07 21:29:14

标签: c++ boost boost-asio

我正在尝试使用Boost库创建一个简单的异步接收器。我按照例子和书籍,这是我到目前为止能够做的事情:

class networkUDPClient {
public:
    utilityTripleBuffer * buffer;

    char testBuffer[20] = { 0 };

    const char * hostAddress;
    unsigned int port;

    boost::asio::io_service service;
    boost::asio::ip::udp::socket socket;
    boost::asio::ip::udp::endpoint listenerEndpoint;
    boost::asio::ip::udp::endpoint senderEndpoint;

    // Function Definitions
    void readCallback(const boost::system::error_code & err, std::size_t read_bytes) {

    }

    // Constructors
    networkUDPClient(const char * hostAddress, unsigned int port, unsigned int bufferSize) :
            socket(service),
            listenerEndpoint(boost::asio::ip::address_v4::from_string(hostAddress), port)
        {
            this->buffer = new utilityTripleBuffer(bufferSize, nullptr);

            this->hostAddress = hostAddress;
            this->port = port;

            socket.open(this->listenerEndpoint.protocol());
            socket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
            socket.bind(this->listenerEndpoint);
            socket.async_receive_from(boost::asio::buffer(this->buffer->currentBufferAddr, this->buffer->bufferSize), 0, senderEndpoint, readCallback);
            service.run();
        };
    ~networkUDPClient()
        {
            service.stop();

            delete this->buffer;
        };
};

问题是 async_receive_from 函数导致错误:

严重级代码描述项目文件行抑制状态 错误(活动)没有重载函数的实例“boost :: asio :: basic_datagram_socket :: async_receive_from [with Protocol = boost :: asio :: ip :: udp,DatagramSocketService = boost :: asio :: datagram_socket_service

我仔细检查了参考网站以及我的所有书籍,我相信我传递了正确的论据并正确地初始化它们。可能导致这个问题的原因是什么?

奖金问题:

虽然我在这里,但我想知道在这种情况下是否可以使用动态指针。我需要对我收到的数据进行双重缓冲,给自己一些时间来处理前一帧。在这种情况下, this-> buffer-> currentBufferAddr 将在每次接收数据后发生变化,每次指向不同的缓冲区。

这是一种可接受的做事方式吗?

1 个答案:

答案 0 :(得分:2)

首先,您的参数似乎有点混乱。 async_receive_fromflags参数作为第三个参数,而将其作为第二个

对于第二部分,您必须为所有实例设置静态函数,以便将其作为处理程序传递,或者将其与this绑定,以便调用正确的实例。

绑定它:

socket.async_receive_from
(
    boost::asio::buffer(buffer.data(), buffer.size()),
    senderEndpoint,
    0,
    std::bind(&readCallback, this, std::placeholders::_1, std::placeholders::_2)
);

或者如果你使readCallback静态:

socket.async_receive_from
(
    boost::asio::buffer(buffer.data(), buffer.size()),
    senderEndpoint,
    0,
    readCallback
);