首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost:asio获取异常

Boost:asio获取异常
EN

Stack Overflow用户
提问于 2016-08-16 11:03:23
回答 1查看 594关注 0票数 0

我正在使用boost.asio编写一个客户端服务器演示。我浏览了http演示并从头开始编写了自己的代码。但是,当acceptor被初始化时,我得到了一个异常(很有可能)。我不确定为什么我会得到这个异常,我的示例http代码(来自boost站点)正在做同样的事情,并且运行良好。

下面是我的server.h代码示例,

代码语言:javascript
复制
 #include <boost/asio.hpp>
 #include <boost/noncopyable.hpp>
 #include "Connection.h"
 #include <iostream>

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

 class Server : private boost::noncopyable
 {
   public:
   explicit Server(const std::string& address, const std::string& port);

   void run();

   private:
   boost::asio::ip::tcp::acceptor   _acceptor;
   boost::asio::io_service          _ioService;
   CONNECTION_SHARED_POINTER        _connection;

   void start_accept();
   void handle_accept(const boost::system::error_code& e);
   void handle_stop();
 };

server.cpp代码

代码语言:javascript
复制
#include "Server.h"
#include <boost/bind.hpp>


Server::Server(const std::string& address, const std::string& port)
    :_acceptor(_ioService),
     _connection()
{

    boost::asio::ip::tcp::resolver resolver(_ioService);
    boost::asio::ip::tcp::resolver::query query(address, port);
    boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);

    _acceptor.open(endpoint.protocol());
    _acceptor.set_option(
                boost::asio::ip::tcp::acceptor::reuse_address(true));
   _acceptor.bind(endpoint);
   _acceptor.listen();


   //Starting the acceptor
   start_accept();
 }

void Server::run()
{
   std::cout<< "Running ioService" <<std::endl;
   _ioService.run();
}

void Server::start_accept()
{
    _connection.reset(new Connection(_ioService));

    std::cout<< "Accept connection" <<std::endl;
    _acceptor.async_accept( _connection->socket(),
                        boost::bind(    &Server::handle_accept, this,
                                        boost::asio::placeholders::error));


}

void Server::handle_accept(const boost::system::error_code& e)
{

   if (!e)
   {
      _connection->start();
    }

   start_accept();
 } 

还有我的main.cpp

代码语言:javascript
复制
#include "Server.h"
#include <iostream>

int main(int argc, char* argv[])
{
  try
     {
        Server s("0.0.0.0", "7000");
        s.run();
   }
   catch (std::exception& e)
   {
       std::cerr << "exception: " << e.what() << "\n";
   }

    return 0;
 }

现在,我的代码在初始化_acceptor时,在Server CTOR中得到了一个执行。错误消息如下:

代码语言:javascript
复制
Unhandled exception at 0x7747d7f6 in VrfServer.exe: 0xC0000005: Access violation reading location 0xffffffffffffffff.

堆栈转储如下所示:

代码语言:javascript
复制
 ntdll.dll!000000007747d7f6()   
 [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
 VrfServer.exe!boost::asio::detail::win_mutex::lock()  Line 51  C++
 VrfServer.exe!boost::asio::detail::scoped_lock<boost::asio::detail::win_mutex>::scoped_lock<boost::asio::detail::win_mutex>(boost::asio::detail::win_mutex & m)  Line 47   C++
VrfServer.exe!boost::asio::detail::service_registry::do_use_service(const boost::asio::io_service::service::key & key, boost::asio::io_service::service * (boost::asio::io_service &)* factory)  Line 108 + 0x12 bytes  C++
VrfServer.exe!boost::asio::detail::service_registry::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >()  Line 49    C++
VrfServer.exe!boost::asio::use_service<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & ios)  Line 34 C++
VrfServer.exe!boost::asio::basic_io_object<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::basic_io_object<boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & io_service)  Line 91 + 0x36 bytes   C++
VrfServer.exe!boost::asio::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >::basic_socket_acceptor<boost::asio::ip::tcp,boost::asio::socket_acceptor_service<boost::asio::ip::tcp> >(boost::asio::io_service & io_service)  Line 86  C++
VrfServer.exe!Server::Server(const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & address, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & port)  Line 8 + 0x76 bytes  C++
VrfServer.exe!main(int argc, char * * argv)  Line 8 + 0x52 bytes    C++
VrfServer.exe!__tmainCRTStartup()  Line 555 + 0x19 bytes    C
VrfServer.exe!mainCRTStartup()  Line 371    C
kernel32.dll!00000000772259bd()     
ntdll.dll!000000007745a2e1()    

有没有人能提供一点线索?

EN

回答 1

Stack Overflow用户

发布于 2016-08-16 14:53:37

这个问题与asio无关,它只是C++的工作方式

Server类中声明:

代码语言:javascript
复制
   private:
   boost::asio::ip::tcp::acceptor   _acceptor;
   boost::asio::io_service          _ioService;
   CONNECTION_SHARED_POINTER        _connection;

然后按如下所示进行初始化:

代码语言:javascript
复制
Server::Server(const std::string& address, const std::string& port)
    :_acceptor(_ioService),
     _connection()

初始化_acceptor时,由于类中声明顺序的原因,_ioService尚未初始化。

代码语言:javascript
复制
   boost::asio::io_service          _ioService;
   boost::asio::ip::tcp::acceptor   _acceptor;
   CONNECTION_SHARED_POINTER        _connection;

应该可以解决这个问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38966022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档