我正在尝试使用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 将在每次接收数据后发生变化,每次指向不同的缓冲区。
这是一种可接受的做事方式吗?
答案 0 :(得分:2)
首先,您的参数似乎有点混乱。 async_receive_from
将flags
参数作为第三个参数,而将其作为第二个。
对于第二部分,您必须为所有实例设置静态函数,以便将其作为处理程序传递,或者将其与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
);