Я застрял с этой проблемой в течение последних 5 часов или около того .. Извините, если вопрос слишком очевиден / noob, но я сам noob, когда дело доходит до boost :: asio или tcp / ip в целом.
Так вот в чем проблема.Я пытаюсь изменить пример блокирующий tcp сервер :
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
вне цикла.Я, вероятно, делаю что-то очень неправильно.Но я не могу выяснить, что.
Дополнительный вопрос:
Каким было бы самое простое решение, чтобы иметь сокетное соединение между некоторым пользовательским интерфейсом и внутренним процессом?