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