1
我一直坚持这个过去5个小时左右..对不起,如果问题太明显/ noob,但我是noob自己,当涉及到提升:: asio或一般tcp/ip。Boost :: asio阻止Tcp服务器混淆
所以这里是问题所在。我想修改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和后端进程之间的套接字连接的简单的解决方案?
是的,但这并不能解决问题。为什么不在for循环之外执行'write'? – FailedDev
@FailedDev,看你的循环。你的服务器读取一些数据并等待另一个数据到达。只有当客户端断开连接时,循环才会终止,'write'永远不会在有效的套接字上执行。 – Abyx
那么,我怎么能做到我想要的,就是拿走所有的数据,直到没有剩下的东西,对它做些什么,然后再写回一些东西?这个例子不可能吗?感谢您的帮助。 +1 – FailedDev