2011-03-04 99 views
2

我在連接到另一個套接字後將套接字連接到端點時遇到了問題。在Windows中使用Boost asio重新連接套接字

情況是這樣的:

一個)boost::asio::ip::tcp::socket被連接到遠程主機(比如pop.remote1.com)。

B)時,傳輸結束,並關閉套接字:

socket_.shutdown(boost::asio::ip::tcp::socket::shutdown_both, error); 
socket_.close(error); 

然後,嘗試連接到另一臺主機(當發言權pop.remote2.com),在使用相同的過程a),該過程沒有錯誤返回,但套接字保持關閉狀態。

注意,使用pop.remote2.com作爲第一個連接時,事情辦得好吧,如果嘗試關閉後連接到pop.remote1.com出現同樣問題。

在這兩種情況下,附件io_service中都沒有掛起的進程。

的問題是:

是再連接受理?

這是假設的正確過程嗎?

在此先感謝。

P.D: 我試圖在重新連接之前打開套接字,但結果保持不變。也就是說,如果在關閉之前的連接後結果相同。

socket_.shutdown(...); 
socket_.close(...); 

用於

socket_.open(...); 
socket_.async_connect(...); 

或只是

socket_.async_connect(...); 

最後一個想法:

花了一段時間後,對這個問題,並做一些調試與MS Visual Studio中,我認爲這是不可能的,至少在阿西奧訴1.45.0; Windows 32和VC++。

也許問題是,在這裏 - 所有人都在思考和使用對象,如果有時需要重新連接,只需刪除適當的對象,並建立一個新的連接...創建一個新的對象!

這是我在我的應用程序中所做的解決方案,取得了良好的效果,並帶有一些額外的代碼。

HTH給別人。

+0

如何重新連接插座? – 2011-03-04 13:37:34

+0

@Stefan感謝您的關注。正如我告訴Sam Miller,爲了重新使用,我使用了一個簡單的'async_connect()',但沒有成功 - 第一次連接的應用程序 - 。 – 2011-03-04 21:44:46

+0

相關:http://stackoverflow.com/questions/3062803/how-do-i-cleanly-reconnect-a-boostsocket-following-a-disconnect – GrahamS 2011-03-09 11:04:52

回答

0

重新連接是否可以接受?

是那個應該正確處理?

是和否。如果您之前沒有打開後續連接的套接字,那麼您需要這樣做。例如:

socket_.open(); 
socket_.async_connect(...); 
+0

非常感謝您的回答。 要重新連接我使用一些lilke: 'socket_.async_connect(端點,提高::綁定(hndlConnect,這一點, 的boost ::支持ASIO ::佔位符::錯誤,++ endpoint_iterator));' 這一工程每次第一次,順便說一句,該文檔說:「套接字是自動打開,如果它尚未打開」。 任何方式,我會嘗試在重新連接之前打開你的建議,看看會發生什麼。 – 2011-03-04 21:29:21

+0

@您確實沒有錯,如果它尚未打開,async_connect將隱式地打開套接字。我不清楚你有什麼問題。你能否更新你的問題來澄清它?例如,您在連接處理程序中遇到什麼錯誤代碼? – 2011-03-06 21:23:46