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;
}