AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77220815
Accepted
Qwe Qwe
Qwe Qwe
Asked: 2023-10-03 16:43:57 +0800 CST2023-10-03 16:43:57 +0800 CST 2023-10-03 16:43:57 +0800 CST

Arquivo de soquete Boost/Asio

  • 772

No passado, escrevi um servidor tcp simples usando a biblioteca boost e o código abaixo funcionando corretamente.

#include <cstdlib>
#include <iostream>
#include <memory>
#include <utility>
#include <boost/asio.hpp>

using boost::asio::ip::tcp;

class session
  : public std::enable_shared_from_this<session>
{
public:
  session(tcp::socket socket)
    : socket_(std::move(socket))
  {
  }

  void start()
  {
    do_read();
  }

private:
  void do_read()
  {
    auto self(shared_from_this());
    socket_.async_read_some(boost::asio::buffer(data_, max_length),
        [this, self](boost::system::error_code ec, std::size_t length)
        {
          if (!ec)
          {
            do_write(length);
          }
        });
  }

  void do_write(std::size_t length)
  {
    auto self(shared_from_this());
    boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
        [this, self](boost::system::error_code ec, std::size_t /*length*/)
        {
          if (!ec)
          {
            do_read();
          }
        });
  }

  tcp::socket socket_;
  enum { max_length = 1024 };
  char data_[max_length];
};

class server
{
public:
  server(boost::asio::io_context& io_context, short port)
    : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
  {
    do_accept();
  }

private:
  void do_accept()
  {
    acceptor_.async_accept(
        [this](boost::system::error_code ec, tcp::socket socket)
        {
          if (!ec)
          {
            std::make_shared<session>(std::move(socket))->start();
          }

          do_accept();
        });
  }

  tcp::acceptor acceptor_;
};

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

    boost::asio::io_context io_context;

    server s(io_context, std::atoi(argv[1]));

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

  return 0;
}

Agora eu quero usar o arquivo de soquete chamado "mysocket" e usá-lo em vez de ip/port. E eu mudei apenas abaixo das linhas. Também espero que o arquivo "mysocket" seja criado automaticamente a partir da linha a seguir. Então eu não o criei manualmente.

  server(boost::asio::io_context& io_context, short port)
    : acceptor_(io_context, boost::asio::local::stream_protocol::endpoint("mysocket"))
  {
    do_accept();
  }

boost::asio::local::stream_protocol::acceptor acceptor_;

Mas eu não compilo e dá o erro abaixo. Como posso consertar isso?

main.cpp: In member function ‘void server::do_accept()’:
main.cpp:67:27: error: no matching function for call to ‘boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept(server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>)’
   67 |     acceptor_.async_accept(
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
   69 |         {
      |         ~                  
   70 |           if (!ec)
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
   73 |           }
      |           ~                
   75 |           do_accept();
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1398:3: note: candidate: ‘template<class Protocol1, class Executor1, class AcceptToken>  requires  completion_token_for<AcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket<Protocol1, Executor1>&, AcceptToken&&, typename boost::asio::constraint<std::is_convertible<Protocol, Protocol1>::value>::type) [with Protocol1 = Protocol1; Executor1 = Executor1; AcceptToken = AcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1398 |   async_accept(basic_socket<Protocol1, Executor1>& peer,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1398:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   ‘server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>’ is not derived from ‘boost::asio::basic_socket<Protocol, Executor>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1531:3: note: candidate: ‘template<class Executor1, class AcceptToken>  requires  completion_token_for<AcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket<Protocol, Executor1>&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, AcceptToken&&) [with Executor1 = Executor1; AcceptToken = AcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1531 |   async_accept(basic_socket<protocol_type, Executor1>& peer,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1531:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   ‘server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)>’ is not derived from ‘boost::asio::basic_socket<boost::asio::local::stream_protocol, Executor1>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note: candidate: ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(MoveAcceptToken&&) [with MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1679 |   async_accept(
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1679:3: note: constraints not satisfied
In file included from /usr/local/include/boost/asio/detail/handler_type_requirements.hpp:53,
                 from /usr/local/include/boost/asio/impl/execution_context.hpp:18,
                 from /usr/local/include/boost/asio/execution_context.hpp:409,
                 from /usr/local/include/boost/asio/detail/scheduler.hpp:21,
                 from /usr/local/include/boost/asio/system_context.hpp:19,
                 from /usr/local/include/boost/asio/impl/system_executor.hpp:21,
                 from /usr/local/include/boost/asio/system_executor.hpp:671,
                 from /usr/local/include/boost/asio/associated_executor.hpp:24,
                 from /usr/local/include/boost/asio/any_completion_handler.hpp:28,
                 from /usr/local/include/boost/asio.hpp:21,
                 from main.cpp:5:
/usr/local/include/boost/asio/async_result.hpp: In substitution of ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<MoveAcceptToken>(MoveAcceptToken&&) [with MoveAcceptToken = boost::asio::local::stream_protocol]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<Executor>::other)>’ [with MoveAcceptToken = server::do_accept::._anon_255; Executor = boost::asio::any_io_executor; Protocol = boost::asio::local::stream_protocol]
/usr/local/include/boost/asio/async_result.hpp:1212:3:   in requirements with ‘T&& t’ [with Signatures = {void()}; T = server::do_accept::._anon_255]
/usr/local/include/boost/asio/async_result.hpp:1214:37: note: the required expression ‘async_initiate<T, Signatures ...>(boost::asio::detail::initiation_archetype<Signatures ...>{}, t)’ is invalid
 1214 |     async_initiate<T, Signatures...>(
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
 1215 |         detail::initiation_archetype<Signatures...>{}, t);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1plus: note: set ‘-fconcepts-diagnostics-depth=’ to at least 2 for more detail
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1936:3: note: candidate: ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(const Executor1&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = Executor1; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 1936 |   async_accept(const Executor1& ex,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:1936:3: note:   template argument deduction/substitution failed:
main.cpp: In substitution of ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<Executor1, MoveAcceptToken>(const Executor1&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = boost::asio::local::stream_protocol; MoveAcceptToken = boost::asio::any_io_executor]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value), Executor1>::type>::other)>’ [with MoveAcceptToken = void; Executor1 = server::do_accept::._anon_255; Protocol = boost::asio::local::stream_protocol]
main.cpp:67:27: error: no type named ‘type’ in ‘struct boost::asio::constraint<false, server::do_accept()::<lambda(boost::system::error_code, boost::asio::ip::tcp::socket)> >’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note: candidate: ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(ExecutionContext&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = ExecutionContext; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2035 |   async_accept(ExecutionContext& context,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2035:3: note: constraints not satisfied
main.cpp: In substitution of ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<ExecutionContext, MoveAcceptToken>(ExecutionContext&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = boost::asio::local::stream_protocol; MoveAcceptToken = boost::asio::any_io_executor]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<typename ExecutionContext::executor_type>::other)>’ [with MoveAcceptToken = void; ExecutionContext = server::do_accept::._anon_255; Protocol = boost::asio::local::stream_protocol]
main.cpp:67:27: error: no type named ‘executor_type’ in ‘struct server::do_accept()::<lambda(class boost::system::error_code, boost::asio::ip::tcp::socket)>’
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
      |                            
   75 |           do_accept();
      |           ~~~~~~~~~~~~     
   76 |         });
      |         ~~                 
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note: candidate: ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&) [with MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2211 |   async_accept(endpoint_type& peer_endpoint,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note:   template argument deduction/substitution failed:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2211:3: note: constraints not satisfied
In file included from /usr/local/include/boost/asio/detail/handler_type_requirements.hpp:53,
                 from /usr/local/include/boost/asio/impl/execution_context.hpp:18,
                 from /usr/local/include/boost/asio/execution_context.hpp:409,
                 from /usr/local/include/boost/asio/detail/scheduler.hpp:21,
                 from /usr/local/include/boost/asio/system_context.hpp:19,
                 from /usr/local/include/boost/asio/impl/system_executor.hpp:21,
                 from /usr/local/include/boost/asio/system_executor.hpp:671,
                 from /usr/local/include/boost/asio/associated_executor.hpp:24,
                 from /usr/local/include/boost/asio/any_completion_handler.hpp:28,
                 from /usr/local/include/boost/asio.hpp:21,
                 from main.cpp:5:
/usr/local/include/boost/asio/async_result.hpp: In substitution of ‘template<class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::async_accept<MoveAcceptToken>(boost::asio::basic_socket_acceptor<boost::asio::local::stream_protocol>::endpoint_type&, MoveAcceptToken&&) [with MoveAcceptToken = boost::asio::local::stream_protocol]’:
main.cpp:67:27:   required from here
/usr/local/include/boost/asio/async_result.hpp:1209:20:   required for the satisfaction of ‘completion_token_for<MoveAcceptToken, void(boost::system::error_code, typename Protocol::socket::rebind_executor<Executor>::other)>’ [with MoveAcceptToken = void; Executor = boost::asio::any_io_executor; Protocol = boost::asio::local::stream_protocol]
/usr/local/include/boost/asio/async_result.hpp:1212:3:   in requirements with ‘T&& t’ [with Signatures = {void()}; T = void]
/usr/local/include/boost/asio/async_result.hpp:1212:3: error: forming reference to void
 1212 |   requires(T&& t)
      |   ^~~~~~~~~~~~~~~
 1213 |   {
      |   ~
 1214 |     async_initiate<T, Signatures...>(
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1215 |         detail::initiation_archetype<Signatures...>{}, t);
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 1216 |   };
      |   ~
In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2500:3: note: candidate: ‘template<class Executor1, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(const Executor1&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&, typename boost::asio::constraint<(boost::asio::is_executor<Executor1>::value || boost::asio::execution::is_executor<T>::value)>::type) [with Executor1 = Executor1; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2500 |   async_accept(const Executor1& ex, endpoint_type& peer_endpoint,
      |   ^~~~~~~~~~~~
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2500:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   candidate expects 4 arguments, 1 provided
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   73 |           }
      |           ~                
   74 | 
   75 |           do_accept();

   76 |         });

In file included from /usr/local/include/boost/asio.hpp:43,
                 from main.cpp:5:
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2603:3: note: candidate: ‘template<class ExecutionContext, class MoveAcceptToken>  requires  completion_token_for<MoveAcceptToken, void()> auto boost::asio::basic_socket_acceptor<Protocol, Executor>::async_accept(ExecutionContext&, boost::asio::basic_socket_acceptor<Protocol, Executor>::endpoint_type&, MoveAcceptToken&&, typename boost::asio::constraint<std::is_convertible<ExecutionContext&, boost::asio::execution_context&>::value>::type) [with ExecutionContext = ExecutionContext; MoveAcceptToken = MoveAcceptToken; Protocol = boost::asio::local::stream_protocol; Executor = boost::asio::any_io_executor]’
 2603 |   async_accept(ExecutionContext& context,
/usr/local/include/boost/asio/basic_socket_acceptor.hpp:2603:3: note:   template argument deduction/substitution failed:
main.cpp:67:27: note:   candidate expects 4 arguments, 1 provided
   67 |     acceptor_.async_accept(
      |     ~~~~~~~~~~~~~~~~~~~~~~^
   68 |         [this](boost::system::error_code ec, tcp::socket socket)
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   69 |         {
      |         ~                  
   70 |           if (!ec)
      |           ~~~~~~~~         
   71 |           {
      |           ~                
   72 |             std::make_shared<session>(std::move(socket))->start();
      |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   75 |           do_accept();
   76 |         });

Versão do meu boost:

#include <boost/version.hpp>
#include <iostream>

int main() {
std::cout << "Using Boost "     
          << BOOST_VERSION / 100000     << "."  // major version
          << BOOST_VERSION / 100 % 1000 << "."  // minor version
          << BOOST_VERSION % 100                // patch level
          << std::endl;    
    return 0;
}
Using Boost 1.82.0
c++
  • 1 1 respostas
  • 47 Views

1 respostas

  • Voted
  1. Best Answer
    sehe
    2023-10-03T20:28:30+08:002023-10-03T20:28:30+08:00

    Você precisa alterar o tipo de soquete na classe de sessão. Abstraindo um pouco melhor:

    Ao vivo no Coliru

    #include <boost/asio.hpp>
    #include <iostream>
    
    namespace asio = boost::asio;
    using boost::system::error_code;
    // using Protocol = boost::asio::ip::tcp;
    using Protocol = boost::asio::local::stream_protocol;
    
    class session : public std::enable_shared_from_this<session> {
      public:
        session(Protocol::socket socket) : socket_(std::move(socket)) {}
    
        void start() { do_read(); }
    
      private:
        void do_read() {
            auto self(shared_from_this());
            socket_.async_read_some(asio::buffer(data_, max_length),
                                    [this, self](error_code ec, std::size_t length) {
                                        if (!ec) {
                                            (std::cout << ec.message() << " '").write(data_, length) << "'\n";
                                            do_write(length);
                                        }
                                    });
        }
    
        void do_write(std::size_t length) {
            auto self(shared_from_this());
            asio::async_write(socket_, asio::buffer(data_, length),
                              [this, self](error_code ec, std::size_t /*length*/) {
                                  if (!ec) {
                                      do_read();
                                  }
                              });
        }
    
        Protocol::socket socket_;
        enum { max_length = 1024 };
        char data_[max_length];
    };
    
    class server {
      public:
        server(asio::any_io_executor ex, Protocol::endpoint ep) : acceptor_(ex, ep) { do_accept(); }
    
      private:
        void do_accept() {
            acceptor_.async_accept([this](error_code ec, Protocol::socket socket) {
                if (!ec) {
                    std::make_shared<session>(std::move(socket))->start();
                }
    
                do_accept();
            });
        }
    
        Protocol::acceptor acceptor_;
    };
    
    int main(int argc, char* argv[]) {
        try {
            if (argc != 2) {
                std::cerr << "Usage: async_echo_server <endpoint>\n";
                return 1;
            }
    
            asio::io_context ioc(1);
    
            // uint16_t port = std::atoi(argv[1]);
            // server   s(ioc.get_executor(), {{}, port});
            server s(ioc.get_executor(), argv[1]);
            ioc.run();
    
        } catch (std::exception& e) {
            std::cerr << "Exception: " << e.what() << "\n";
            return 1;
        }
    }
    

    Você pode facilmente mudar tudo para TCP alternando as 3 linhas comentadas

    • 1

relate perguntas

  • Por que os compiladores perdem a vetorização aqui?

  • Erro de compilação usando CMake com biblioteca [fechada]

  • Erro lançado toda vez que tento executar o premake

  • Como criar um tipo de octeto semelhante a std::byte em C++?

  • Somente operações bit a bit para std::byte em C++ 17?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve