0
我在线获得了这个代码,并且一直试图向它添加一个计时器,以便它每隔一段时间就读一个数据包。我似乎无法弄清楚如何通过一个回调函数来了boost :: async_wait命令,因为我得到这个错误:如何将异步定时器添加到升级UDP服务器?
server1.cpp: In member function ‘void UDPClient::handle_receive(const boost::system::error_code&, size_t)’:
server1.cpp:51:66: error: invalid use of non-static member function ‘void UDPClient::time_to_receive(const boost::system::error_code&)’
boost::asio::placeholders::error));
^
server1.cpp:33:6: note: declared here
void UDPClient::time_to_receive(const boost::system::error_code& error)
^~~~~~~~~
UDPClient类:
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
using boost::asio::ip::udp;
class UDPClient
{
public:
boost::asio::io_service io_service;
udp::socket socket;
udp::endpoint receiver_endpoint;
boost::asio::deadline_timer timer;
boost::array<char, 1024> recv_buffer;
UDPClient();
void time_to_receive(const boost::system::error_code& error);
void do_receive();
void handle_receive(const boost::system::error_code& error, size_t);
};
UDPClient::UDPClient()
: io_service(),
socket(io_service, {udp::v4(), 3643}),
timer(io_service, boost::posix_time::seconds(2))
{
do_receive();
io_service.run();
}
void UDPClient::time_to_receive(const boost::system::error_code& error)
{
do_receive();
}
void UDPClient::do_receive()
{
socket.async_receive_from(boost::asio::buffer(recv_buffer), receiver_endpoint,
boost::bind(&UDPClient::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void UDPClient::handle_receive(const boost::system::error_code& error, size_t bytes_transferred)
{
std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
timer.async_wait(boost::bind(time_to_receive,
boost::asio::placeholders::error));
}
int main()
{
UDPClient updclient;
}
一个问题,我试图用这个代码回答是,如果我用一堆UDP数据包从客户端发送服务器垃圾邮件,服务器会在async_wait期间忽略所有数据包吗?
此外,我的主要目标是将此代码放入我拥有的quadcopter代码中。它是否会按照写入的方式实例化这个类并让它从地面站读取数据包以获取用户输入?
哇,谢谢你的说明。我甚至没有意识到那个哈哈。至于更新,我实际上可以编译,所以谢谢。但是,我有一个新问题,那就是async_wait不会导致服务器等待2秒钟。我用很多邮件发送垃圾邮件,并且收到每封邮件都没有延迟。 – rangeme
哦,好吧,我明白了。 async_wait会在2秒后取消定时器,因此您必须调用expires_from_now? – rangeme
现在它正在工作,我测试了如果使用UDP数据包从客户端向服务器发送服务器垃圾邮件,会发生什么情况。即使我每2秒调用一次async_receive_from,它仍然会获得每一个数据包。所以它落后了。是否可以忽略async_receive_from调用之间的所有数据包? – rangeme