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

Error: system: 995 asio

+1 głos
902 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 (354,880 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ź 322 wizyt
pytanie zadane 13 czerwca 2018 w C i C++ przez PelikanFix16 Użytkownik (950 p.)
0 głosów
2 odpowiedzi 723 wizyt
pytanie zadane 5 marca 2016 w C i C++ przez 0xf Dyskutant (8,180 p.)
0 głosów
1 odpowiedź 427 wizyt

93,631 zapytań

142,556 odpowiedzi

323,056 komentarzy

63,139 pasjonatów

Advent of Code 2025

Top 15 użytkowników

  1. 2900p. - dia-Chann
  2. 2870p. - DziarnowskiJ
  3. 2827p. - Łukasz Piwowar
  4. 2783p. - raydeal
  5. 2758p. - Adrian Wieprzkowicz
  6. 2713p. - rucin93
  7. 2579p. - Łukasz Eckert
  8. 2523p. - Maurycy W
  9. 2459p. - CC PL
  10. 2082p. - Michal Drewniak
  11. 1885p. - robwarsz
  12. 1851p. - Mariusz Fornal
  13. 1811p. - rafalszastok
  14. 1600p. - Rafał Trójniak
  15. 1588p. - Tomasz Bielak
Szczegóły i pełne wyniki

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

Kursy INF.02 i INF.03
...