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