[更新]後使用來自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&’
有人知道這個實現有什麼問題嗎?
'make_shared <>'會將它的參數(如綁定或線程c'tor)。你必須將'io_service_'包裝在'boost :: ref'中:'make_shared(boost :: ref(io_service_),...'。 –
太棒了!那就做了。我怎麼能把這個標記爲答案? :) – BHZ
我做了一個答案。 –