【问题标题】:Boost-ASIO async_receive_from function overload issue (+ dynamic pointer)Boost-ASIO async_receive_from 函数重载问题(+ 动态指针)
【发布时间】:2018-02-07 21:29:14
【问题描述】:

我正在尝试使用 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 每次接收数据后都会发生变化,每次都指向不同的缓冲区。

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

【问题讨论】:

  • 尝试回调static void readCallback还是使用bind绑定this?问题中的错误信息不完整
  • 传递 boost::bind(&networkUDPClient::readCallback, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred 而不仅仅是 readCallback
  • 错误消息正是 Visual Studio 为我提供的。我想知道为什么需要绑定函数,而所有的例子(包括 Torjo 书)都不需要。
  • 非静态成员函数有一个 hidden this 参数,但处理程序原型没有这样的参数。所以你只能传递普通函数、静态成员函数或 lambda。否则,您必须将第一个参数绑定到 this 并获取一个仅需要 2 个参数的函数。
  • 我没有使用 boost::asio 的经验,无法回答额外问题,没有进一步研究 :) 很高兴我能提供帮助

标签: c++ boost boost-asio


【解决方案1】:

首先,您的参数似乎有点混乱。 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
);

【讨论】:

  • 谢谢。错误放置的标志参数肯定是问题之一。绑定是否适用于不采用 (const boost::system::error_code & err, std::size_t read_bytes) 参数的回调函数?假设我想将函数指针传递给类,以便回调执行我想要的任何随机函数。我需要什么?
  • @AdmiralFishHead 绑定时始终坚持所需的参数,否则您很可能会出错。 理论上您可以将任何函数签名传递给std::bind。否则我不太清楚你的意思,你可能想发布另一个问题。
  • 当然,一旦我偶然发现无法调试的错误,我会提出来。
  • @AdmiralFishHead 如果有帮助,请记住接受答案。还有关于你的老问题。 stackoverflow.com/help/accepted-answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2010-12-27
  • 2017-12-03
  • 1970-01-01
相关资源
最近更新 更多