使用boost :: asio创建异步UDP客户端,Expression:string iterator not dereferencable

时间:2016-05-13 06:53:02

标签: c++ boost-asio udpclient

我使用boost :: asio

制作异步UDP客户端

当接收async_receive_from错误

的数据时,发送数据是正常的

错误消息:表达式:字符串迭代器无法取消引用。

我的代码有什么问题?
谁能解释一下。非常感谢。

UDPClient::UDPClient()
    : socket_(io_service, udp::endpoint (udp::v4(), 0))
{

    receiver_endpoint = boost::asio::ip::udp::endpoint(
        boost::asio::ip::address::from_string("127.0.0.1"),
        8080);
    do_receive();
    boost::function0< void> f =  boost::bind(&UDPClient::Sendtest,this);
    boost::thread t(f);
    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 << "recve" << std::endl;
    if (!error || error == boost::asio::error::message_size)
        do_receive();
}

void UDPClient::Sendtest()
{
    while(true)
    {
        boost::thread::sleep(boost::get_system_time()+boost::posix_time::seconds(10));  
        str = "23434";
        size_t leng = str.length();
        socket_.async_send_to( boost::asio::buffer(str,leng) ,
            receiver_endpoint,
            boost::bind(&UDPClient::handle_write,this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::bytes_transferred
            )       
            );
    }
}

void UDPClient::handle_write(const boost::system::error_code &error,size_t bytes_transferred)
{
    cout << "handle_write_over! " << endl;
}
int main()
{
    UDPClient updclient;
}

1 个答案:

答案 0 :(得分:0)

这三行看起来像我的问题:

str = "23434";
size_t leng = str.length();
socket_.async_send_to( boost::asio::buffer(str,leng) ,

假设str被声明为std::string对象,您需要知道std::string不能隐式转换为ASIO缓冲区。

你可以试试这个:

stocket_.async_send_to(boost::asio::buffer(&str.front(), leng),

或者这应该正确编译:

stocket_.async_send_to(boost::asio::buffer(str),

我还要注意你在这个程序中遇到了一个不同的问题,因为你在确定数据已经发送之前就重新使用了缓冲区。但这超出了这个问题的范围,代表了一个设计问题,你必须自己或在另一个问题上解决。