gpt4 book ai didi

c++ - 在套接字关闭之前不发送数据

转载 作者:行者123 更新时间:2023-11-30 05:13:50 24 4
gpt4 key购买 nike

我正在学习一些网络编程,被推荐使用boost-asio。我做了日间教程 1 和 2:http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial.html并希望对其进行修改,以便服务器对发送序列化对象的客户端使用react,然后发回结果。我想象使用类似以下序列的内容,目的是让客户端坐在 handleRead 循环中等待服务器完成:

服务器:
accept --> handleRead --> process_read --> 执行 Action --> 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++ 和网络编程还很陌生,因此也非常感谢任何其他文档。谢谢!

最佳答案

当然,您会陷入阅读循环。它直到 Steam 结束才会退出,并且只有在对等方关闭套接字时才会发生流结束。

关于c++ - 在套接字关闭之前不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43746345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com