0

我正在使用 Boost::asio Libs 构建 TCP 客户端。我的程序有一个 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

我尝试使用wireshark。我可以看到命令正在正确发送。我在这里做的可能是什么错误?

4

1 回答 1

2

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));

第二个参数指定要使用的字符串的最大长度。但由于它是一个常量字符串,所以第二个参数并不是绝对必要的。

于 2013-03-11T14:25:07.723 回答