在构造函数之后初始化boost::asio套接字
Initializing boost::asio sockets after constructor
[Update:]对于感兴趣的人来说,答案是简单地将io_service成员var包装在boost::ref(boost::ref(io_service_))
我正在尝试从boost asio库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))
{
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<>
复制其参数(如bind
或thread
's c'tor)。当传递给make_shared
时,您必须将io_service_
包装在boost::ref
中,以确保它作为引用传递:
socket_p = boost::make_shared(boost::ref(io_service_), udp::endpoint(udp::v4(), port));
此代码在windows上的code::Blocks IDE上编译良好(尽管我将boost::shared_ptr更改为c++11 std::shared_ptr)。
可能问题在于您的boost库的安装或编译器/链接器的设置。
编辑:使用的编译器是mingw_64。Boost版本为1_58_0
相关文章:
- 为异步发送缓冲区保留内存(提升 asio 套接字)
- 如何通过超时检查Boost ASIO套接字中的数据
- 提升 ASIO 套接字io_service.运行阻塞
- 我可以在两个不同的类实例中使用boost asio套接字引用吗
- boost::system::error_code::message()引发了带有boost::asio套接字的访问冲突
- 提升 ASIO 套接字使用文件描述符
- 从不同线程写入boost::asio套接字
- 使用boost::asio套接字接收错误数据
- Windows 上的 Boost asio 套接字无法async_connect
- 读取前检查boost::asio套接字上的数据?或者我应该使用async_read()
- 无法重新连接boost asio套接字客户端
- 如何把c++ /CLI . net套接字变成boost::asio套接字
- 我如何有效地使用boost asio套接字进行全双工流
- 使用boost序列化在boost-asio套接字连接上发送序列化类型
- 在构造函数之后初始化boost::asio套接字
- 在不关闭本机处理程序的情况下销毁Boost Asio套接字
- Boost ASIO套接字读取N字节不多不少,等待它们到来或超时异常
- 通过代理服务器增强asio套接字连接
- 来自 Boost::asio 套接字async_read_some操作的内存泄漏
- 异步调用后删除asio套接字