Cześć. Mam problem z boost::asio, gdyż przerabiałem ten poradnik: https://www.gamedev.net/blogs/entry/2249317-a-guide-to-getting-started-with-boostasio/?page=2, aż natrafiłem na przykład 7c, z acceptorami, i mój kod, jak i kod z poradnika wywala mi, że nastąpił jakiś error 995. Poczytałem w internecie, i dowiedziałem cię, że jest to bodajże problem z socketem, i wątkiem: https://stackoverflow.com/questions/7228703/the-i-o-operation-has-been-aborted-because-of-either-a-thread-exit-or-an-applica, i nie wiem jak ten problem rozwiązać. Oto mój kod:
#include <boost/asio.hpp> #include <boost/shared_ptr.hpp> #include <boost/thread.hpp> #include <boost/thread/mutex.hpp> #include <boost/bind.hpp> #include <boost/lexical_cast.hpp> #include <iostream> #include <string> void thread(boost::shared_ptr<boost::asio::io_service> ioService, boost::mutex *streamLock) { streamLock->lock(); std::cout << "Now I'm running: "<< boost::this_thread::get_id() << "\n"; streamLock->unlock(); while (true) { try { boost::system::error_code errorCode; ioService->run(errorCode); if (errorCode) { streamLock->lock(); std::cout << "["<< boost::this_thread::get_id() << "] Exception: "<< errorCode << std::endl; streamLock->unlock(); } break; } catch (const std::exception& exception) { streamLock->lock(); std::cout << "["<< boost::this_thread::get_id() << "] Exception: "<< exception.what() << std::endl; streamLock->unlock(); } } streamLock->lock(); std::cout << "And now is my turn: "<< boost::this_thread::get_id() << "\n"; streamLock->unlock(); } void onConnect(const boost::system::error_code &errorCode, boost::mutex *streamLock) { if (errorCode) { streamLock->lock(); std::cout << "["<< boost::this_thread::get_id() << "] Error: "<< errorCode << std::endl; streamLock->unlock(); } else { streamLock->lock(); std::cout << "["<< boost::this_thread::get_id() << "]""Connected!"<< std::endl; streamLock->unlock(); } } void connect(boost::shared_ptr<boost::asio::io_service> ioService, boost::mutex *streamLock, boost::shared_ptr<boost::asio::ip::tcp::socket> socket, boost::shared_ptr<boost::asio::ip::tcp::acceptor> acceptor) { try { boost::asio::ip::tcp::resolver resolver(*ioService); boost::asio::ip::tcp::resolver::query query("127.0.0.1", boost::lexical_cast<std::string>(7777)); boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query); boost::asio::ip::tcp::endpoint endpoint = *iterator; acceptor->open(endpoint.protocol()); acceptor->set_option(boost::asio::ip::tcp::acceptor::reuse_address(false)); acceptor->bind(endpoint); acceptor->listen(boost::asio::ip::tcp::socket::max_connections); acceptor->async_accept(*socket, boost::bind(onConnect, _1, streamLock)); streamLock->lock(); std::cout << "Connecting to: "<< endpoint << "\n"; streamLock->unlock(); } catch (const std::exception& exception) { streamLock->lock(); std::cout << "["<< boost::this_thread::get_id() << "] Exception: "<< exception.what() << std::endl; streamLock->unlock(); } } int main() { boost::shared_ptr<boost::asio::io_service> ioService(new boost::asio::io_service); boost::shared_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(*ioService)); boost::shared_ptr<boost::asio::ip::tcp::socket> socket(new boost::asio::ip::tcp::socket(*ioService)); boost::shared_ptr<boost::asio::io_service::strand> strand(new boost::asio::io_service::strand(*ioService)); boost::shared_ptr<boost::asio::ip::tcp::acceptor> acceptor(new boost::asio::ip::tcp::acceptor(*ioService)); boost::mutex streamLock; boost::thread_group threadsGroup; for (unsigned short int i = 0; i < 3; ++i) { threadsGroup.create_thread(boost::bind(thread, ioService, &streamLock)); } std::cin.get(); // ioService->post(strand->wrap(boost::bind(simpleCalculate, 1, &streamLock))); // ioService->post(strand->wrap(boost::bind(simpleCalculate, 3, &streamLock))); // ioService->post(strand->wrap(boost::bind(simpleCalculate, 5, &streamLock))); // boost::asio::deadline_timer timer(*ioService); // timer.expires_from_now(boost::posix_time::seconds(5)); // timer.async_wait(strand->wrap(boost::bind(timerHandler, _1, &streamLock))); connect(ioService, &streamLock, socket, acceptor); std::cin.get(); boost::system::error_code ec; acceptor->close(ec); boost::system::error_code error; socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, error); socket->close(error); ioService->stop(); threadsGroup.join_all(); std::cin.get(); return 0; }