簡體   English   中英

Boost asio ip tcp iostream錯誤檢測

[英]Boost asio ip tcp iostream Error Detection

問候。 我剛剛開始使用boost :: asio庫,並且遇到了一些與boost :: asio :: ip :: tcp :: iostream有關的早期難題。

我的問題分為兩部分:

1.)如何僅使用主機和端口號連接iostream?

我可以使客戶端服務器 [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()。 是這樣做的方法,還是還有其他方法。


對其中之一或兩者的建議將不勝感激。 另外,如果我忽略了相關的文檔和/或示例,那將是很好的。 到目前為止,我還無法通過閱讀庫文檔或搜索'net來回答這些問題。

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

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

應該管用。

關於錯誤檢測:

tcp::socket有一個connect()方法,該方法采用和終結點,並引用了boost::system::error_code對象,該對象將告訴您是否成功連接。

即使未返回任何錯誤,stream.error()仍包含最新的錯誤代碼。 我用了代碼

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

您也只能檢查特定的錯誤boost :: asio :: error :: connection_refused。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM