TCP-клиент в Boost Asio

Я собираю TCP-клиент, используя Boost :: asio Libs. В моей программе есть поток write (), который отправляет команду на сервер

write(*_socket,boost::asio::buffer("sspi l1\n\n",sizeof("sspi l1\n\n")));

Затем запускается поток чтения, который все время читает из буфера, поскольку могут быть сообщения, транслируемые с сервера из-за любого другого клиента.

void TCP_IP_Connection::readTCP()
{

size_t l=0;

this->len=0;
boost::system::error_code error;try
{//loop reading all values from router
while(1)
{

//wait for reply??l=_socket->read_some(boost::asio::buffer(this->reply,sizeof(this->reply)),error);
if(error)
throw boost::system::system_error(error);

if(l>0)
{

this->dataProcess(l);

}
else
boost::this_thread::sleep(boost::posix_time::milliseconds(5000));_io.run();

if(error==boost::asio::error::eof) //connection closed by router
std::cout<<"connection closed by router";

_io.reset();

}

}

catch (std::exception& e)
{
std::cerr << e.what() << std::endl;
}

}

Этот поток выполняется все время в цикле while (1) и должен находиться в спящем режиме, когда длина принятых данных меньше нуля. Он читает все данные и вызывает функцию парсера данных. После этого поток записи используется для отправки другой команды с запущенным потоком чтения. Но вместо требуемого ответа сервер отправляет обратно

  ? ""ERROR: Unknown command

Я пытался использовать проволочную акулу. Я вижу, что команда отправляется правильно. В чем может быть ошибка, которую я делаю здесь?

0

Решение

sizeof («sspi l1 \ n \ n») возвращает 10, но я могу посчитать только 9 символов в этой строке.

Попробуйте это вместо этого:

const std::string cmd("sspi l1\n\n");
write(*_socket,boost::asio::buffer(cmd, cmd.length()));

Или когда у вас есть в виде строки, достаточно сделать

const std::string cmd("sspi l1\n\n");
write(*_socket,boost::asio::buffer(cmd));

Второй аргумент указывает максимальную длину используемой строки. Но поскольку это постоянная строка, второй аргумент не является строго обязательным.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]