2012-10-11 192 views
3

我有一個簡單的boost::asio::ip::tcp::acceptor,它幾乎不做任何事 - 它接受無限循環中的連接。然後,我有一些在同一時間運行嘗試連接的連接器...boost :: asio set_option error

pSocket->async_connect(endpoint, 
     [=](boost::system::error_code error) 
     { 
      if(!error) 
      { 
       boost::asio::ip::tcp::no_delay noDelay(true); 
       pSocket->set_option(noDelay, error); 
       assert(!error); 
       std::cout << error.message() << '\n'; // "An invalid argument was supplied" 
      } 
     }); 

一切都在無限循環運行,我跑2個客戶端和1臺服務器,所有的環回連接。在連接的插座上設置no_delay選項後,經過一段時間(數百次成功連接和斷開連接),出現錯誤An invalid argument was supplied

在什麼情況下可以在套接字上設置選項會導致此錯誤? 有沒有人看到過這個,知道它爲什麼會發生和/或解決它的方法嗎?

更新: 如果我改變設定set_option喜歡的東西......

do 
{ 
    pSocket->set_option(noDelay, error); 
} while(error); 

...它會成功 - 通常在第二次嘗試失敗後。

+0

你在用什麼編譯器? –

+0

@SamMiller Visual Studio 2010 – David

+1

這聽起來像是比賽條件。確保你永遠不會嘗試從多個線程同時訪問你的套接字。 –

回答

1

昨天我一步一步調試set_option,問題是set_option使用io_service_impl對象,但它包含錯誤的套接字指針,這就是爲什麼它會崩潰。但是,在套接字創建沒有什麼設置此套接字,所以我認爲你不能在這種方式設置套接字選項。

您必須set_option之前打開插座,async_connectset_option前試試這個:

sock->open(boost::asio::ip::tcp::v4()); 

錯誤被稱爲Bad file descriptor其直接上set_option調用非初始化的插座。

+0

該錯誤甚至在具有'acceptor'的應用程序中都沒有。它在客戶端,它調用'async_connect' – David

+0

你接受之前嘗試設置選項嗎? –

+0

我並沒有在接受方面設置選項......就像我說的 - 所有這些都在接線方面。 – David