2009-06-24 114 views
1

問候。我剛剛開始使用boost :: asio庫,並遇到了與boost :: asio :: ip :: tcp :: iostream相關的一些早期難題。升壓asio ip tcp iostream錯誤檢測

我的問題有兩個部分:

1)一個人如何使用連接簡單的主機和端口號對iostream?

我可以使clientserver [boost.org]示例工作正常編碼。服務器明確指定端口:

boost::asio::io_service io_service; 

tcp::endpoint endpoint(tcp::v4(), 13); 
tcp::acceptor acceptor(io_service, endpoint); 

端口13是「白天」服務的着名端口。

客戶端例如通過指定主機和服務名連接:

tcp::iostream s(argv[1], "daytime"); 

對於我自己的應用程序,我想放在服務器中的任意端口上,並通過數字連接,如下圖所示:

服務器:

boost::asio::io_service io_service; 
tcp::endpoint endpoint(tcp::v4(), port); 
tcp::acceptor acceptor(io_service, endpoint); 
acceptor.accept(*this->socketStream.rdbuf()); 
... 

客戶:

boost::asio::ip::tcp::iostream sockStream; 
... 
sockStream.connect("localhost", port); 
... 

如果在客戶端中,我嘗試直接指定端口號(而不是名稱服務),則流無法連接。有沒有辦法做到這一點?我不清楚連接的論據可能/應該是什麼。


2.)測試iostream :: connect調用成功的首選方法是什麼?

該函數返回void,並且不引發異常。到目前爲止,我設計的唯一方法是測試stream.fail()和/或stream.good()。這是做到這一點的方式,還是有其他一些方法。


對其中一項或兩項的建議將不勝感激。另外,如果我忽視相關文檔和/或示例,那將會很不錯。到目前爲止,我還沒有通過閱讀圖書館文檔或搜索「網絡」來回答這些問題。

回答

3

我不知道爲什麼asio不起作用(至少在Boost 1.35.0中),端口號表示爲int。但是,您可以將端口號指定爲一個字符串。即

tcp::iostream s(hostname, "13"); 

應該工作。關於

錯誤檢測:

tcp::socket有connect()方法這需要和端點和一個boost::system::error_code對象,它會告訴你,如果它成功地連接一個參考。

+0

感謝您的幫助。那麼有沒有辦法使用tcp :: socket並將其放入tcp :: iostream中? – 2009-06-24 20:04:45

0

即使沒有錯誤返回,stream.error()包含最新的錯誤代碼。我使用的代碼

do 
{ 
    m_stream.clear(); 
    m_stream.connect(host, port); 
} 
while(m_stream.error());` 

你也可以只檢查特定錯誤的boost ::支持ASIO ::錯誤:: connection_refused。