簡體   English   中英

傳遞boost :: asio :: ip :: tcp :: socket

[英]Passing around boost::asio::ip::tcp::socket

好的,這是我目前的代碼片段:

namespace bai = boost::asio::ip;
bai::tcp::socket tcp_connect(std::string hostname, std::string port) {
    try {
        boost::asio::io_service io_service;
        bai::tcp::resolver resolver(io_service);

        // we now try to get a list of endpoints to the server 
        bai::tcp::resolver::query query(hostname, port);
        bai::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
        bai::tcp::resolver::iterator end;

        // looking for a successful endpoint connection
        bai::tcp::socket socket(io_service);
        boost::system::error_code error = boost::asio::error::host_not_found;
        while (error && endpoint_iterator != end) {
            socket.close();
            socket.connect(*endpoint_iterator++ , error);
        }

        if (error) throw boost::system::system_error(error);

        return socket;
    } catch (std::exception &ex) {
        std::cout << "Exception: " << ex.what() << "\n";
    }
}

哪個應該返回一個boost::asio::ip::tcp::socket連接到port上的hostname 但是我遇到了一些難以理解的boost::noncopyable錯誤。 但我的問題是,我該如何繞過這些插座呢? 這有什么問題?

socket無法復制。 請改用boost::shared_ptr<bai::tcp::socket> 如果您可以復制一個套接字,如果您最終得到兩個代表相同底層操作系統套接字的socket實例,那么您將遇到各種有趣的問題 - 因此,不允許復制(因此按值返回,按值傳遞) 。

編碼:

return socket;

嘗試使套接字的副本返回,然后在函數退出時銷毀原始套接字。 不幸的是,無法復制套接字(它們管理必須關閉的底層操作系統資源,因此系統必須確保只存在對該資源的一個引用,否則當第一個副本超出范圍時會出現嚴重錯誤)。

正如在另一個答案中所建議的那樣,你可以使用一個指針來返回在堆上創建的對象(應該使用shared_ptr進行管理,如果你只在一個地方使用unique_ptr,則更有效),或者如果你使用C ++ 11你可以使用移動構造函數作為返回值:

return std::move (socket);

這將避免使用堆分配和指針的必要性,因此可能是更好的解決方案。

暫無
暫無

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

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