gpt4 book ai didi

c++ - Boost::asio 阻塞 Tcp 服务器困惑

转载 作者:太空宇宙 更新时间:2023-11-04 12:14:04 24 4
gpt4 key购买 nike

在过去 5 个小时左右的时间里,我一直被这个问题所困扰。如果这个问题太明显/菜鸟,我很抱歉,但在一般情况下,我自己就是 boost::asio 或 tcp/ip。

所以问题来了。我正在尝试修改 blocking tcp server example :

void session(socket_ptr sock)
{
try
{
for (;;)
{
char data[max_length];

boost::system::error_code error;
size_t length = sock->read_some(boost::asio::buffer(data), error);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.

boost::asio::write(*sock, boost::asio::buffer(data, length));
}
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}

我想要做的是将所有 block 或 read_some 方法保存到这个示例 std::string 的某个缓冲区中,然后在发回回复之前对它们做一些事情:

const int max_length = 10;

typedef boost::shared_ptr<tcp::socket> socket_ptr;

void session(socket_ptr sock)
{
std::string dataReceived = "";
try
{
for (;;)
{
char data[max_length] = {'\0'};
boost::system::error_code error;
size_t length = sock->read_some(boost::asio::buffer(data), error);
dataReceived += std::string(data, length);
if (error == boost::asio::error::eof)
break; // Connection closed cleanly by peer.
else if (error)
throw boost::system::system_error(error); // Some other error.
//boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size()));
}
boost::asio::write(*sock, boost::asio::buffer(&dataReceived[0], dataReceived.size()));
}
catch (std::exception& e)
{
std::cerr << "Exception in thread: " << e.what() << "\n";
}
}

当我从循环中删除 write 时,客户端挂起。 dataReceived 包含所有数据。缓冲区故意很小,以便多次调用 read_some。在调试器中,控件永远不会转到循环外的 write 方法。我可能做错了什么。但我无法找出是什么。

附带问题:

在某些 UI 和后端进程之间建立套接字连接的最简单解决方案是什么?

最佳答案

可能它挂起是因为客户端等待服务器回复并且不发送新数据。

此外,服务器只有在连接关闭时才会退出表单循环,并且没有地方可以写入数据。

关于c++ - Boost::asio 阻塞 Tcp 服务器困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8489766/

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