【发布时间】:2012-01-19 08:36:54
【问题描述】:
在过去的 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";
}
}
我想要做的是将所有块或 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 boost-asio