2012-08-10 109 views
1

我正在更好地學習boost :: asio,在最近的過程中我已經將它用於一些基本的服務器應用程序。所以我想我知道(一點)的基本知識。boost :: asio使用工作線程的多個傳出SSL連接

但是今天我有我似乎無法來解決一個問題:

我想作一些傳出SSL連接的(方式100多個)。出於這個原因,我使用了一些工作線程(因爲我讀過的方式更好)。除io_service->run()之外,這些工作線程沒有太多的代碼。我使用boost :: asio SSL客戶端示例作爲開始,並將這些工作線程添加到此源。在main()我開始這些工作線程之後,我發佈任務io_service對象是這樣的:

int main(int argc, char * argv[]) 

    boost::shared_ptr<boost::asio::io_service> io_service(
      new boost::asio::io_service 
    ); 
    boost::shared_ptr<boost::asio::io_service::work> work(
      new boost::asio::io_service::work(*io_service) 
    ); 
    boost::shared_ptr<boost::asio::io_service::strand> strand(
      new boost::asio::io_service::strand(*io_service) 
    ); 

    boost::thread_group worker_threads; 
    for(int x = 0; x < 4; ++x) 
    { 
      worker_threads.create_thread(boost::bind(&WorkerThread, io_service)); 
    } 

    io_service->post(boost::bind(&doConnect, io_service, "127.0.0.1", "7777")); 
    io_service->post(boost::bind(&doConnect, io_service, "192.168.2.3", "7777")); 

    work.reset(); 

    worker_threads.join_all(); 

    return 0; 

} 

doConnect()什麼更然後從主的原始代碼作爲升壓:: ASIO SSL客戶端的例子中:

void doConnect(boost::shared_ptr<boost::asio::io_service> io_service, string host, string port) { 

    boost::asio::ip::tcp::resolver resolver(*io_service); 
    boost::asio::ip::tcp::resolver::query query(host, boost::lexical_cast<std::string>(port)); 
    boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query); 

    boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23); 
    ctx.load_verify_file("server.crt"); 

    client c(io_service, ctx, iterator); 
} 

此代碼編譯得很好,但執行過程中發生的是我收到一個Operation canceled錯誤。

我嘗試了一些東西:

  1. 在這個網站我,也許在示例代碼構造有這樣的this指針走出的範圍問題尖端一些閱讀後,我試圖使用shared_from_this()。這導致exception: tr11: weak pointer

  2. 爲了擺脫這個弱指針問題,我嘗試將代碼從構造函數移動到它自己的方法Start(),並在doConnect()方法中創建對象後調用此方法。沒有結果,弱指針問題仍然存在。

  3. 之後,我將代碼移回到構造函數中,就像在示例中那樣,並刪除了所有SSL特定代碼,更改爲普通套接字類型並再次運行它。現在我再次收到原始錯誤:Operation canceled,所以它似乎與SSL代碼沒有任何關係。

  4. 一路走來(但肯定沒有SSL代碼),我還收到一條錯誤消息,說沒有網絡。

誰能閃耀在這個問題上他或她的光,因爲我無法找到有關錯誤消息本身或理由太多的信息,爲什麼(除了建議,套接字被關閉或超出範圍(以及隨後關閉))..

如果需要更多的信息,請告訴我,我會發布更多的文字或代碼...

+0

糟糕,大家都可以看到,錯誤在於客戶端類沒有通過shared_ptr實例化。 我把客戶端c(io_service,ctx,iterator);'換成'boost :: shared_ptr c(新客戶端(io_service,ctx,iterator));'並且它全部開始工作... – ikku 2012-08-10 23:23:21

+0

please回答你自己的問題,這在堆棧溢出上是完美的 – 2012-08-11 18:41:46

回答

0

解決:問題是簡單的(但忽略)事實上,我沒有通過shared_ptr實例化客戶端對象。我改回了我的選擇1嘗試,並且對象現在是一個shard_ptr,弱指針異常消失了,並且一切都按照它的樣子工作。

相關問題