2012-02-16 22 views
1

私はサーバからの受信データを常に必要とするブーストasync tcpクライアントを持っています。 n秒間サーバーとの接続を切断して接続しようとすると、データが失われてしまったときにタイムアウトしてもらいたいです。 私はvC++を使用しています。TCPデータのタイムアウトが私のために働いていない

void tcpclient::Connect(){ 
    ..... 
    socket_.async_connect(*iterator,boost::bind(&tcpclient::AfterConnection,shared_from_this(),boost::asio::placeholders::error)); 
    } 

    void tcpclient::AfterConnection(const boost::system::error_code& error){ 
     if (!error) 
     { 
      SetTimeout(); 
     } 
    } 

    void tcpclient::SetTimeout(int sec = 1) 
    { 

    SOCKET native_sock = socket_.native(); 
    int result = SOCKET_ERROR; 
    if (INVALID_SOCKET != native_sock) 
    { 
     struct timeval tv; 
     tv.tv_sec = sec; 
     tv.tv_usec = 0; 
     result = setsockopt(native_sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(struct timeval)); 
     i = GetLastError(); 

    } 

    } 

と私は打撃のように読める:

 socket_.async_receive(boost::asio::buffer(buffer, 1024), 
      boost::bind(&tcpClient::handleReceive, 
      shared_from_this(), 
      boost::asio::placeholders::error, 
      buffer, 
      boost::asio::placeholders::bytes_transferred) 
      ); 

が、私は、データ接続の滞在をariveていないケースをシミュレートしてみetablished:

$ netstatの-ao

TCPを192.168.0.6:62836 192.168.0.5:telnet ESTABLISHED 2840

なぜt彼の出来事?

+0

テレビが私に初期化されていないようです。残りのメンバーを0に設定する –

+0

iquasionが表示されているように修正するが、まだ問題は残っている –

答えて

1

設定をSO_RCVTIMEOに設定すると、ブロッキングされていないソケットがすぐに完了するため、指定した時間待機した後、readへのそれ以外の呼び出しはデータなしで戻ります。

したがって、問題は、readがEWOULDBLOCKエラーを返したときに、あなたは何をするのですか?どのように読んでいるのかを示す必要があります。ブーストがイベントループ(selectまたはpollに基づいて)でそれを処理している場合、おそらくちょうどいくつかのデータが利用可能になるのを待つだけです。

これが当てはまる場合は、イベントループにタイマーコールバックを登録して毎秒または頻繁に発生させ、前の秒間に何らかのデータが受信されたかどうかを確認することをお勧めします。ソケットオプションはあなたには役に立ちません。

関連する問題