Я собираю 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
Я пытался использовать проволочную акулу. Я вижу, что команда отправляется правильно. В чем может быть ошибка, которую я делаю здесь?
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));
Второй аргумент указывает максимальную длину используемой строки. Но поскольку это постоянная строка, второй аргумент не является строго обязательным.
Других решений пока нет …