我正在更好地學習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
錯誤。
我嘗試了一些東西:
在這個網站我,也許在示例代碼構造有這樣的
this
指針走出的範圍問題尖端一些閱讀後,我試圖使用shared_from_this()
。這導致exception: tr11: weak pointer
。爲了擺脫這個弱指針問題,我嘗試將代碼從構造函數移動到它自己的方法
Start()
,並在doConnect()
方法中創建對象後調用此方法。沒有結果,弱指針問題仍然存在。之後,我將代碼移回到構造函數中,就像在示例中那樣,並刪除了所有SSL特定代碼,更改爲普通套接字類型並再次運行它。現在我再次收到原始錯誤:
Operation canceled
,所以它似乎與SSL代碼沒有任何關係。一路走來(但肯定沒有SSL代碼),我還收到一條錯誤消息,說沒有網絡。
誰能閃耀在這個問題上他或她的光,因爲我無法找到有關錯誤消息本身或理由太多的信息,爲什麼(除了建議,套接字被關閉或超出範圍(以及隨後關閉))..
如果需要更多的信息,請告訴我,我會發布更多的文字或代碼...
糟糕,大家都可以看到,錯誤在於客戶端類沒有通過shared_ptr實例化。 我把客戶端c(io_service,ctx,iterator);'換成'boost :: shared_ptr c(新客戶端(io_service,ctx,iterator));'並且它全部開始工作... –
ikku
2012-08-10 23:23:21
please回答你自己的問題,這在堆棧溢出上是完美的 – 2012-08-11 18:41:46