C++ can';无法从套接字接收数据。异步\u从
我已经在udp_服务器类中创建了异步函数start_receive()和start_send()。但按代码,不会停止并等待“async\u receive\u from”行。这是我的密码C++ can';无法从套接字接收数据。异步\u从,c++,boost-asio,C++,Boost Asio,我已经在udp_服务器类中创建了异步函数start_receive()和start_send()。但按代码,不会停止并等待“async\u receive\u from”行。这是我的密码 class udp_server { public: udp_server(boost::shared_ptr< boost::asio::io_service > io_service, const std::string& host, const st
class udp_server
{
public:
udp_server(boost::shared_ptr< boost::asio::io_service > io_service,
const std::string& host,
const std::string& port
) : io_service_(*io_service), socket_(*io_service, udp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 7777))
{
udp::resolver resolver(io_service_);
udp::resolver::query query(udp::v4(), host, port);
udp::resolver::iterator iter = resolver.resolve(query);
endpoint_ = *iter;
std::cout << "end point>>" << endpoint_ << std::endl;
//start_receive();
}
void start_receive()
{
std::cout << "Gotin>>start_receive" << std::endl;
//std::cout << "Gotin>>" << std::endl;
socket_.async_receive_from(
boost::asio::buffer(recv_buffer_), remote_endpoint_,
boost::bind(&udp_server::handle_receive, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
));
}
void handle_receive(const boost::system::error_code& error, std::size_t msg_len)
{
using namespace std;
std::cout << "Got>> handle_receive" << std::endl;
//size_t data_length = data.size();
//std::cout.write(recv_buffer_.data(), recv_buffer_.size());
if (!error || error == boost::asio::error::message_size)
{
//std::cout << "msg_len:" << msg_len << std::endl;
std::cout.write(recv_buffer_.data(), msg_len);
std::cout << ", " << msg_len << std::endl;
start_send(recv_buffer_.data(), msg_len);
recv_buffer_.assign(0);
start_receive();
}
}
void start_send(const std::string& msg, std::size_t msg_len)
{
socket_.async_send_to(boost::asio::buffer(msg, msg_len), remote_endpoint_,
boost::bind(&udp_server::handle_send, this, msg,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
void handle_send(const std::string& msg/*message*/,
const boost::system::error_code& /*error*/,
std::size_t tx_size/*bytes_transferred*/)
{
std::cout << "send>" << msg << std::endl;
//std::cout << "size>" << tx_size << std::endl;
//std::cout << "send>" << msg << std::endl;
}
private:
boost::asio::io_service& io_service_;
udp::endpoint endpoint_;
udp::socket socket_;
udp::endpoint remote_endpoint_;
boost::array<char, 1000> recv_buffer_;
};
int main()
{
try
{
boost::shared_ptr< boost::asio::io_service > io_service(new boost::asio::io_service);
udp_server server(io_service, "localhost", "6666");
//boost::asio::io_service io_service;
//udp_server server(io_service);
//io_service.run();
boost::thread_group tgroup;
tgroup.create_thread( boost::bind(&udp_server::start_receive, &server));
tgroup.join_all();
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}
return 0;
}
class-udp\u服务器
{
公众:
udp_服务器(boost::shared_ptrio_服务,
常量std::字符串和主机,
常量std::字符串和端口
):io_服务(io_服务),套接字(io_服务,udp::端点(boost::asio::ip::address::from_字符串(“127.0.0.1”),7777))
{
udp::解析器解析器(io_服务);
udp::resolver::query查询(udp::v4(),主机,端口);
udp::resolver::iterator iter=resolver.resolve(查询);
终点=iter;
std::cout您应该给io\u服务.run()
提供线程,而不是给socket.async\u receive\u from()
您的代码类似于:
tgroup.create_thread([&]{ io_service->run(); }); // or bind(&io_service::run, io_service)
io_service.dispatch([&]{ server.start_receive(); }); // or bind(&udp_server::start_receive, &server)
tgroup.join_all();
另一方面,您没有将io_服务存储到共享指针中。您的程序中没有共享所有权。然后我在io_服务的第1行中遇到了一个错误“class boost::shared_ptr'没有名为“run”的成员”。run();我尝试了您的方法,但现在错误在您的第一行代码中出现,“调用'boost::thread_group::create_thread(main():::_lambda0)'”时没有匹配的函数,@AnumSheraz-我相信您可以修复一些简单的编译错误;-)