2015-07-12 25 views
2

[更新]後使用來自boost asio庫的udp服務器示例來查看是否可以在構造函數以外的地方初始化套接字。在本例中提出的構造函數如下:初始化的boost :: ASIO插座的構造

class server 
{ 
public: 
    server(boost::asio::io_service& io_service, short port) 
    : io_service_(io_service), 
     socket_(io_service, udp::endpoint(udp::v4(), port)) 
    { 
    socket_.async_receive_from(
     boost::asio::buffer(data_, max_length), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 

我所做的插座件的指針,也是一個共享指針,這樣我就不必擔心它是否失控的範圍。 「io_service_」也是一個成員變量,我用它來創建套接字。我完整的代碼如下:

#include <cstdlib> 
#include <iostream> 
#include <boost/bind.hpp> 
#include <boost/asio.hpp> 
#include <boost/shared_ptr.hpp> 
#include <boost/make_shared.hpp> 

using boost::asio::ip::udp; 

class server 
{ 
public: 
    server(boost::asio::io_service& io_service, short port) 
    : io_service_(io_service) 
     //socket_(io_service, udp::endpoint(udp::v4(), port)) 
    { 
     initialize_socket(port); 
    } 

    void initialize_socket(short port) 
    { 

     socket_p = boost::make_shared<udp::socket>(io_service_, udp::endpoint(udp::v4(), port)); 
     // (...) 
     socket_p->async_receive_from(
       boost::asio::buffer(data_, max_length), sender_endpoint_, 
       boost::bind(&server::handle_receive_from, this, 
         boost::asio::placeholders::error, 
         boost::asio::placeholders::bytes_transferred)); 
    } 

    void handle_receive_from(const boost::system::error_code& error, 
     size_t bytes_recvd) 
    { 
    if (!error && bytes_recvd > 0) 
    { 
     std::cout << "\nReceived: "; 
     std::cout.write(data_, bytes_recvd); 
     std::cout << "\nSending same string back" << std::endl; 
     socket_p->async_send_to(
      boost::asio::buffer(data_, bytes_recvd), sender_endpoint_, 
      boost::bind(&server::handle_send_to, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 
    else 
    { 
     socket_p->async_receive_from(
      boost::asio::buffer(data_, max_length), sender_endpoint_, 
      boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 
    } 

    void handle_send_to(const boost::system::error_code& /*error*/, 
     size_t /*bytes_sent*/) 
    { 
    socket_p->async_receive_from(
     boost::asio::buffer(data_, max_length), sender_endpoint_, 
     boost::bind(&server::handle_receive_from, this, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
    } 

private: 
    boost::asio::io_service& io_service_; 
    boost::shared_ptr<udp::socket> socket_p; 
    udp::endpoint sender_endpoint_; 
    enum { max_length = 1024 }; 
    char data_[max_length]; 
}; 

int main(int argc, char* argv[]) 
{ 
    try 
    { 
    if (argc != 2) 
    { 
     std::cerr << "Usage: async_udp_echo_server <port>\n"; 
     return 1; 
    } 

    boost::asio::io_service io_service; 

    using namespace std; // For atoi. 
    server s(io_service, atoi(argv[1])); 

    io_service.run(); 
    } 
    catch (std::exception& e) 
    { 
    std::cerr << "Exception: " << e.what() << "\n"; 
    } 

    return 0; 
} 

當嘗試編譯,我得到我認爲其中一個相當長的錯誤信息的重要部分是:

required from here 
    /usr/local/include/boost/smart_ptr/make_shared_object.hpp:747:5: error: no matching function for call to ‘boost::asio::basic_datagram_socket<boost::asio 
    ::ip::udp>::basic_datagram_socket(const boost::asio::io_service&, const boost::asio::ip::basic_endpoint<boost::asio::ip::udp>&)’ 
     ::new(pv) T(a1, a2); 

(...)

basic_datagram_socket(boost::asio::io_service& io_service, 
^
/usr/local/include/boost/asio/basic_datagram_socket.hpp:108:3: note: no known conversion for argument 1 from ‘const boost::asio::io_service’ to ‘boost 
::asio::io_service&’ 

有人知道這個實現有什麼問題嗎?

+0

'make_shared <>'會將它的參數(如綁定或線程c'tor)。你必須將'io_service_'包裝在'boost :: ref'中:'make_shared (boost :: ref(io_service_),...'。 –

+0

太棒了!那就做了。我怎麼能把這個標記爲答案? :) – BHZ

+0

我做了一個答案。 –

回答

0

此代碼在Windows上編譯Code :: Blocks IDE(儘管我將boost :: shared_ptr更改爲C++ 11 std :: shared_ptr)。

可能問題出在您的boost庫或編譯器/鏈接器設置的安裝中。

編輯:

使用的編譯器是mingw_64。升級版本是1_58_0。

+0

Code :: Blocks只是一個可以使用許多編譯器之一的IDE。你使用了哪個*編譯器? – dcook

+0

@dook感謝您的通知,追加我的答案。 – Nick

2

make_shared<>複製其參數(如bindthread的c'tor)。你必須傳遞給make_shared時,以確保它被作爲參考傳遞給包裹io_service_boost::ref

socket_p = boost::make_shared(boost::ref(io_service_), udp::endpoint(udp::v4(), port));