C++ Boost ASIO UDP客户端异步接收来自呼叫处理程序的呼叫,即使没有传入消息

C++ Boost ASIO UDP客户端异步接收来自呼叫处理程序的呼叫,即使没有传入消息,c++,boost,udp,boost-asio,C++,Boost,Udp,Boost Asio,我已将Boost Day client教程中的UDP客户端代码修改为以下内容: class UDPClient { public: udp::socket* socket; udp::endpoint* receiver_endpoint; boost::array<char, 1024> recv_buffer; UDPClient(); void do_receive(); void handle_receive(const bo

我已将Boost Day client教程中的UDP客户端代码修改为以下内容:

class UDPClient
{
public:
    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()
{
    boost::asio::io_service io_service;

    udp::resolver resolver(io_service);
    udp::resolver::query query(udp::v4(), "127.0.0.1", "8888");
    receiver_endpoint = new udp::endpoint(*resolver.resolve(query));

    socket = new udp::socket(io_service);
    socket->open(udp::v4());

    do_receive();

    while (true)
    {
        io_service.poll();
        Sleep(1);
    }
}

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)
{
    cout << "ulala" << endl;

    if (!error || error == boost::asio::error::message_size)
        do_receive();
}
类UDPClient
{
公众:
udp::socket*socket;
udp::endpoint*接收方\终端;
boost::数组recv_缓冲区;
UDPClient();
无效不接收();
无效句柄接收(const boost::system::error\u code&error,size\u t);
};
UDPClient::UDPClient()
{
boost::asio::io_服务io_服务;
udp::解析器解析器(io_服务);
udp::解析器::查询查询查询(udp::v4(),“127.0.0.1”,“8888”);
receiver_endpoint=newUDP::endpoint(*resolver.resolve(query));
套接字=新的udp::套接字(io_服务);
套接字->打开(udp::v4());
你收到了吗;
while(true)
{
io_service.poll();
睡眠(1);
}
}
void UDPClient::do_receive()
{
socket->async\u receive\u from(boost::asio::buffer(recv\u buffer),*receiver\u endpoint,
boost::bind(&UDPClient::handle_receive,这个,
boost::asio::占位符::错误,
boost::asio::占位符::字节(已传输);
}
void UDPClient::handle\u receive(常量boost::system::error\u代码和错误,大小\u t字节\u传输)
{
库特
设置用于发送到任意端点的套接字。若要接收(“侦听”),请使用

除此之外,套接字和接收器_端点现在泄漏。要修复此问题,请执行以下操作:

#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::ip::udp;
类UDPClient
{
公众:
boost::asio::io_服务io_服务;
udp::套接字;
udp::端点接收器\ U端点;
boost::数组recv_缓冲区;
UDPClient();
无效不接收();
无效句柄接收(const boost::system::error\u code&error,size\u t);
};
UDPClient::UDPClient()
:io_服务(),
套接字(io_服务,{udp::v4(),8888})
{
你收到了吗;
io_service.run();
}
void UDPClient::do_receive()
{
socket.async_receive_from(boost::asio::buffer(recv_buffer)),receiver_端点,
boost::bind(&UDPClient::handle_receive,这个,
boost::asio::占位符::错误,
boost::asio::占位符::字节(已传输);
}
void UDPClient::handle\u receive(常量boost::system::error\u代码和错误,大小\u t字节\u传输)
{

std::cout感谢输入人员,但似乎我做不到:\n我已经有一个正在运行的服务器,它使用表达式“socket=new udp::socket(io_服务,udp::endpoint(udp::v4(),8888));”,而且我似乎不可能有两个程序同时执行此操作。如果我在客户端也使用这一行,客户端将崩溃,异常为“请求致命程序退出”@ LaiXue,请显示相关代码。我的示例显然是运行的,或者我没有发布ITI尝试使用VC++ 2017中的代码,并得到这个错误:SampleCpp.exe的0x000 000 07FEFD80A06D中未处理的异常:微软C++异常:Booo::ExpExtIOLION::CLONIIMPL在内存位置0x00 000 000 02FE8D0。发生了什么?是的,处理异常和/或查看原因。
async\u receive\u处理程序是否使用错误参数调用?如果是,原因是什么?
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;
}