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