Я делаю асинхронный 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;
}
Эти три строки выглядят для меня проблемой:
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),
Я также хотел бы отметить, что у вас есть другая проблема в этой программе, в которой вы повторно используете буфер, прежде чем будете уверены, что данные были отправлены. Это выходит за рамки этой проблемы, и представляет собой проблему дизайна, которую вам придется решать самостоятельно или по другому вопросу.
Других решений пока нет …