создание асинхронного UDP-клиента с использованием boost :: asio, выражение: строковый итератор без разыменования

Я делаю асинхронный UDP-клиент, используя boost :: asio

отправленные данные в порядке, когда получают данные, которые 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;
}

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),

Я также хотел бы отметить, что у вас есть другая проблема в этой программе, в которой вы повторно используете буфер, прежде чем будете уверены, что данные были отправлены. Это выходит за рамки этой проблемы, и представляет собой проблему дизайна, которую вам придется решать самостоятельно или по другому вопросу.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]