0

メッセージの受信に時間がかかりすぎていないかどうかを確認するために、この例を適応させています。

read_completeが終了すると呼び出されread_startます。ただし、受信したデータが完全であるかどうかを確認し、特定の時間内に完全に受信されていない場合は不完全であると解釈する必要があります。

これらは、コード/疑似コードで上記のコードを拡張したものです。

void read_complete(const boost::system::error_code& error, size_t bytes_transferred)
{ // the asynchronous read operation has now completed or failed and returned an error
  if (!error)
  { // read completed, so process the data
    cout.write(read_msg_, bytes_transferred); // echo to standard output
    MyOnReceivedData(MyHandle someHandle, numOfBytes);
    read_start(); // start waiting for another asynchronous read again
  }
  else do_close(error);
} 

void MyOnReceivedData(MyHandle someHandle,int numOfBytes){
  ResetPacketTimer();
  \\check if whole packet was received
  if (wholePacket){    
    MyOnReceivedPacket(someHandle);    
  }
}

void MyOnReceivedPacket(MyHandle someHandle){
  cout << "packet"
  clearBuffer(someHandle);   
}

void MyOnPacketTimeout(MyHandle someHandle){
   cout << "we're in";
   if (!bufferEmpty(someHandle)){
     cout << "timeout";
   }
}

void ResetPacketTimer(MyHandle someHandle){
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::milliseconds(10000));

    t.async_wait(boost::bind(&MyOnPacketTimeout, someHandle);
    //this works async, but MyOnPacketTimeout is not called
    boost::thread t2(boost::bind(&boost::asio::io_service::run, &io));
    //this works, but not async - app waits for 10 secs
    //io.run();
}

ここで同様の質問をしましたが、この環境でdeadline_timerを設定するにはどうすればよいですか? 、しかし今、私はすでにタイマーを機能させています-それはスレッドの問題に関するものです。したがって、これが問題である場合は、古い質問を閉じてください。ただし、この質問はしないでください。

私の主な問題は、どうすれば を行うことができるかということResetPacketTimerです。

  • 10 秒以上かかったパケットをキャッチします
  • 最初のパケットの 10 秒がなくなる前に、別のパケットが既に部分的に受信されていた場合 (したがって、clearBufferはまだ呼び出されていません) 、1 つをキャッチしたとは思わないでください。
4

0 に答える 0