Quantcast
Channel: Forum Pasja Informatyki - Najnowsze pytania bez odpowiedzi
Viewing all articles
Browse latest Browse all 21942

Error: system: 995 asio

$
0
0

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

 


Viewing all articles
Browse latest Browse all 21942