我正在学习一些网络编程,并建议使用boost-asio。我在http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial.html上做了Daytime Tutorials 1& 2并想要修改它,以便服务器对发送序列化对象的客户端作出反应然后发回结果。我想象使用类似下面的顺序,意图客户端将坐在handleRead循环中等待服务器完成:
服务器:
接受 - > handleRead - > process_read - >执行操作 - > handleWrite
客户端:
连接 - > handleWrite - > handleRead - > process_read
但是,当我这样做时,服务器和客户端都会在我设置的读取循环中陷入困境。这在客户端是可取的,但客户端应该在进入读取循环之前写入并发送数据。当我在客户端断开连接或在我写的写入函数的末尾添加socket.close()
时,所有其余的服务器步骤都会使用从客户端发送的相应数据进行。
我原本以为这个问题与启用Nagle的算法有关,但是添加了
boost::asio::ip::tcp::no_delay option(true);
socket.set_option(option);
根本没有帮助。我是否遗漏了教程中没有关于如何发送这些数据的内容,例如刷新套接字?
void myClient::handle_read()
{
boost::system::error_code e;
try
{
for (;;)
{
size_t len = boost::asio::read(socket, boost::asio::buffer(inBuffer), e);
std::cout << "Client Received: ";
if (e == boost::asio::error::eof)
{
break;
}
else if (e)
{
throw boost::system::system_error(e);
}
}
}
catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
std::cout << e.what() << std::endl;
}
}
template <typename T>
void handleWrite(T& t)
{
std::ostringstream archive_stream;
std::string tempString;
boost::archive::text_oarchive archive(archive_stream);
archive << t;
tempString = archive_stream.str();
outBuffer.assign(tempString.begin(), tempString.end());
boost::system::error_code ignored_error;
size_t sent = boost::asio::write(socket, boost::asio::buffer(outBuffer), ignored_error);
std::cout << sent << std::endl;
}
我对c ++和网络编程还是比较陌生的,所以我们也非常感谢任何其他文档。谢谢!
答案 0 :(得分:1)
当然,你陷入了阅读循环。它直到蒸汽结束才退出,流的结束仅在对等体关闭套接字时发生。