2012-02-16 22 views
1

我有一個提升的異步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 – 2012-02-16 13:12:02

+0

將其修復爲您看到iquasion,但問題仍然存在 – 2012-02-16 13:40:46

回答

1

設置SO_RCVTIMEO會導致以其他方式阻止對read的調用,在等待指定時間後返回無數據,因爲非阻塞套接字將立即執行。

因此,問題是,當read返回EWOULDBLOCK錯誤時,您或Boost會做什麼?你需要展示你如何閱讀;如果Boost正在事件循環中處理它(基於selectpoll),它可能只是等待一些數據可用。

如果是這種情況,更好的方法是使用事件循環註冊一個定時器回調來觸發每一秒或經常發生,並檢查您是否在前一秒收到一些數據。套接字選項不會幫助你。

相關問題