我有一个功能,必须搜索网络中的所有电脑并寻找响应:
DLL void get_remote_ip(void)
{
initWSA();
if(create_Sockets() == INVALID_SOCKET)
{
std::cerr << "Socket Error\n";
return;
};
initiate_TXRX_variables();
boost::asio::io_service io_service;
udp_server_search server(io_service);
std::cout << "No crash till here\n";
boost::thread thread_1 = boost::thread(ultra_spam_network_udp);
boost::asio::deadline_timer dt1 = boost::asio::deadline_timer(io_service);
boost::thread thread_2(boost::bind(&boost::asio::io_service::run, &io_service));
dt1.expires_from_now(boost::posix_time::milliseconds(2000));
dt1.wait();
//ip_adr_ccd = server.return_ip(0);
if(ip_adr_ccd != "localhost" && ip_adr_daisy != "localhost")
{
std::cout << "Remote IP of CCD is: " << ip_adr_ccd << '\n';//For debug
std::cout << "Remote IP of TERS is: " << ip_adr_daisy << '\n'; //For debug
}
else
std::cout << "No new remote ips found\n";
//std::cout << Use << '\n';
//thread_1.join();
}
当我调用此函数时,我的程序有时会在没有告诉我原因的情况下崩溃,它只是告诉我“&lt; hex-address&gt;中的异常错误”。我的虫子在哪里?是否有可能一个线程尝试加入,但另一个线程现在还没有完成(这可能是因为错误非常随机并且在写入时杀死主线程的std :: cout-output)?
谢谢!
答案 0 :(得分:3)
我发现了我的错误,我必须先停止io_service
然后再调用thread_2.join()
,否则我的thread_2会崩溃。
答案 1 :(得分:3)
你似乎没有以干净的方式阻止io_service
。 io_serice::run
阻止,同时派遣ramining处理程序。我的猜测是你的udp_server_search
导致处理程序无休止排队。因此,要么您的加入永远不会完成,因为它必须等待run()
返回从未发生过的事情,或者如果您将其评论出来,则get_remote_ip
会在{{1}时删除io_service
继续在现在销毁的对象上执行thread_2
方法。
什么可以解决你的问题(除了打破服务器上无休止的队列)是手动停止ioservice:
run