0

Boost ::asioLibsを使用して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));

2番目の引数は、使用する文字列の最大長を指定します。ただし、これは定数文字列であるため、2番目の引数は厳密には必要ありません。

于 2013-03-11T14:25:07.723 に答える