• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Error: system: 995 asio

42 Warsaw Coding Academy
+1 głos
814 wizyt
pytanie zadane 29 czerwca 2017 w C i C++ przez Avernis Nałogowiec (27,400 p.)

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

 

komentarz 29 czerwca 2017 przez adrian17 Mentor (353,640 p.)
Nie wypowiem się co do kodu/błędu, powiem tylko, że to poradnik z 2011 i wygląda dość staro. Szczególne przekazywanie mutexa przez wskaźnik wygląda dziwnie.
komentarz 29 czerwca 2017 przez Avernis Nałogowiec (27,400 p.)
A,  rzeczywiście z 2011. Nie zauważyłem. Odnośnie mutexa, to mutex akurat działa należycie

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 274 wizyt
pytanie zadane 13 czerwca 2018 w C i C++ przez PelikanFix16 Użytkownik (950 p.)
0 głosów
2 odpowiedzi 628 wizyt
pytanie zadane 5 marca 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 337 wizyt

93,398 zapytań

142,390 odpowiedzi

322,577 komentarzy

62,756 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...