socket = new udp::socket(io_service);
socket->open(udp::v4());
设置一个用于发送到任意端点的套接字。要接收(“听”),请使用
socket = new udp::socket(io_service, udp::endpoint(udp::v4(), 8888));
除此之外,套接字和接收端点现在已经泄漏。要解决这个问题:
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/array.hpp>
#include <iostream>
using boost::asio::ip::udp;
class UDPClient
{
public:
boost::asio::io_service io_service;
udp::socket socket;
udp::endpoint receiver_endpoint;
boost::array<char, 1024> recv_buffer;
UDPClient();
void do_receive();
void handle_receive(const boost::system::error_code& error, size_t);
};
UDPClient::UDPClient()
: io_service(),
socket(io_service, {udp::v4(), 8888})
{
do_receive();
io_service.run();
}
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 << "ulala" << std::endl;
std::cout << "Received: '" << std::string(recv_buffer.begin(), recv_buffer.begin()+bytes_transferred) << "'\n";
if (!error || error == boost::asio::error::message_size)
do_receive();
}
int main()
{
UDPClient updclient;
}
这还会打印收到的消息(假设它是可打印的)。看
- boost::asio async_receive_from UDP端点在线程之间共享? https://stackoverflow.com/questions/26703583/boostasio-async-receive-from-udp-endpoint-shared-between-threads/26705453#26705453
一种可以同时处理多个 UDP 请求的方法。