boost::asio Verständnisproblem



  • Warum funktioniert dieses Programm:

    int main()
    {
    	for(;;)
    	{
    		switch(getch())
    		{
    		case 's': // der server
    			try
    			{
    				boost::asio::io_service io_service;
    
    				tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 8357));
    
    				for(;;)
    				{
    					tcp::socket socket(io_service);
    					acceptor.accept(socket);
    
    					std::string message = "vom server";
    
    					boost::system::error_code ignored_error;
    					boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
    				}
    			}
    			catch(std::exception& e)
    			{
    				std::cerr << e.what() << std::endl;
    			}
    			return 0;
    		case 'c': // der client
    			try
    			{
    				boost::asio::io_service io_service;
    
    				tcp::resolver resolver(io_service);
    				tcp::resolver::query query("127.0.0.1", "8357");
    				tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    
    				tcp::socket socket(io_service);
    				boost::asio::connect(socket, endpoint_iterator);
    
    				boost::asio::streambuf buf;
    				boost::system::error_code error;
    
    				size_t len = boost::asio::read(socket, buf, error);
    
    				if(error == boost::asio::error::eof)
    				{
    					cout << boost::asio::buffer_cast<const char *>(buf.data()), buf.size();
    				}
    				else if(error)
    				{
    					throw boost::system::system_error(error);
    				}
    			}
    			catch(std::exception& e)
    			{
    				std::cerr << e.what() << std::endl;
    			}
    			return 0;
    		case VK_ESCAPE:
    			return 0;
    		}
    	}
    
    	getch();
    	return 0;
    }
    

    Aber das hier nicht:

    int main()
    {
    	for(;;)
    	{
    		switch(getch())
    		{
    		case 's': // der server
    			try
    			{
    				boost::asio::io_service io_service;
    
    				tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 8357));
    
    				for(;;)
    				{
    					tcp::socket socket(io_service);
    					acceptor.accept(socket);
    
    					std::string message = "vom server";
    
    					boost::system::error_code ignored_error;
    					boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
    
    					// neuer Teil
    					boost::asio::streambuf buf;
    					boost::system::error_code error;
    
    					// hier hängt es
    					size_t len = boost::asio::read(socket, buf, error);
    
    					if(error == boost::asio::error::eof)
    					{
    						cout << boost::asio::buffer_cast<const char *>(buf.data()), buf.size();
    					}
    					else if(error)
    					{
    						throw boost::system::system_error(error);
    					}
    				}
    			}
    			catch(std::exception& e)
    			{
    				std::cerr << e.what() << std::endl;
    			}
    			return 0;
    		case 'c': // der client
    			try
    			{
    				boost::asio::io_service io_service;
    
    				tcp::resolver resolver(io_service);
    				tcp::resolver::query query("127.0.0.1", "8357");
    				tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    
    				tcp::socket socket(io_service);
    				boost::asio::connect(socket, endpoint_iterator);
    
    				boost::asio::streambuf buf;
    				boost::system::error_code error;
    
    				// hier hängt es jetzt auch
    				size_t len = boost::asio::read(socket, buf, error);
    
    				if(error == boost::asio::error::eof)
    				{
    					cout << boost::asio::buffer_cast<const char *>(buf.data()), buf.size();
    				}
    				else if(error)
    				{
    					throw boost::system::system_error(error);
    				}
    
    				// neuer Teil
    				std::string message = "vom client";
    
    				boost::system::error_code ignored_error;
    				boost::asio::write(socket, boost::asio::buffer(message), ignored_error);
    			}
    			catch(std::exception& e)
    			{
    				std::cerr << e.what() << std::endl;
    			}
    			return 0;
    		case VK_ESCAPE:
    			return 0;
    		}
    	}
    
    	getch();
    	return 0;
    }
    


  • Wegen der Unterschiede zwischen beiden Programmen.



  • Aber warum hängt das 2. Programm?



  • Weil die Unterschiede gegenüber dem ersten Programm zu einem Fehlverhalten führen.



  • Wieso?
    Ich möchte doch nur, dass der client auch etwas sendet und der server die Daten empfängt.



  • Er hängt weil der Server den Socket nicht zu macht, der Client aber drauf wartet.
    http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/reference/read/overload6.html


Anmelden zum Antworten