Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在构造函数之后初始化boost::asio套接字_C++_Boost_Shared Ptr - Fatal编程技术网

C++ 在构造函数之后初始化boost::asio套接字

C++ 在构造函数之后初始化boost::asio套接字,c++,boost,shared-ptr,C++,Boost,Shared Ptr,[更新:]对于任何感兴趣的人来说,答案都只是将io_服务成员var包装在boost::ref(boost::ref(io_服务))中 我正在使用boost asio库中的udp服务器示例进行实验,以查看是否可以在构造函数之外的其他地方初始化套接字。示例中建议的构造函数如下所示: class server { public: server(boost::asio::io_service& io_service, short port) : io_service_(io_serv

[更新:]对于任何感兴趣的人来说,答案都只是将io_服务成员var包装在boost::ref(boost::ref(io_服务))中

我正在使用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));
  }
#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;
}
我使套接字成员成为指针,同时也是共享指针,这样我就不必担心它是否超出范围。“io_service_”也是一个成员变量,我使用它来创建套接字。我的完整代码如下:

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));
  }
#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;
}

有人知道这个实现出了什么问题吗?

这段代码在windows上的code::Blocks IDE上编译得很好(尽管我将boost::shared_ptr更改为c++11 std::shared_ptr)

问题可能存在于boost库的安装或编译器/链接器设置中

编辑:

使用的编译器是mingw_64。Boost版本是1_58_0。

使_共享
复制其参数(如
绑定
线程
的命令)。当传递到
make_shared
时,必须将
io_服务
包装在
boost::ref
中,以确保它作为引用传递:


socket_p=boost::使_共享(boost::ref(io_服务),udp::endpoint(udp::v4(),port));

code::Blocks只是一个可以使用多种编译器之一的IDE。您使用了哪种编译器?@dcook感谢您的通知,附加了我的答案。
make_shared
复制其参数(如bind或thread c'tor)。您必须将
io_服务
包装在
boost::ref
make_shared(boost::ref(io_服务)…
。太棒了!我怎么能把这个标记为答案呢?:)我做了一个答案。@StefanNäwe,我正在尝试做类似的事情。但是,我没有像io_服务一样的boost::asio::io_服务副本,而是使用直接从外部传递的io_服务。我的代码不起作用。这就是原因吗?我改用拷贝(io_服务_)作为OP,但仍然不起作用。我现在已经不知所措了。