提升Asio错误

时间:2014-12-22 19:36:56

标签: c++ boost windows-7 boost-asio

我试过看看是否有其他人有这个问题,但我还没有在网上找到任何东西。这段代码中的任何内容都看起来像我正在调用boost错误吗?

当我登录到启动TCP服务器的计算机时,此代码有效,但在没有人登录时失败。我将代码删除以仅查看boost asio逻辑。

//create _acceptor, which will eventually listen for incomming connections, asynchronously
_acceptor = boost::shared_ptr<tcp::acceptor>(new tcp::acceptor(*_io_service));
_acceptor->open(tcp::endpoint(tcp::v4(), _port).protocol());
_acceptor->set_option(tcp::acceptor::reuse_address(false));

//omitted logic find a port that is open
_acceptor->bind(tcp::endpoint(tcp::v4(), _port));

//omitted error handling logic if open port not found

//Start listening for incoming connections asynchronously.
_acceptor->listen();

sslSocketPtr ssl_socket(sslSocketPtr(new ssl::stream<ip::tcp::socket>(*_io_service, _sslContext)));
_acceptor->async_accept(ssl_socket->lowest_layer(),
    boost::bind(&TCPServer::handle_sslAccept, shared_from_this(), boost::asio::placeholders::error, ssl_socket));

当没有人登录到机器时,ssl_socket构造函数抛出异常:“static_mutex:访问被拒绝”。

如果我定义BOOST_ASIO_ENABLE_OLD_SSL代码正常工作,但我认为这可能导致我的代码中的另一个错误。所以我试图使用Boost的最新SSL逻辑。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我将假设您在Windows上运行的症状。

在Windows上,static_mutex实现为命名(进程间)互斥,并使用 CreateMutexW “打开”:

  

如果互斥锁是一个已命名的互斥锁且该对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError返回ERROR_ALREADY_EXISTS,忽略bInitialOwner,调用线程未获得所有权。但是,如果调用者具有有限的访问权限,则该函数将失败并显示ERROR_ACCESS_DENIED ,并且调用方应使用OpenMutex函数。

如您所见,您没有所需的权限。但是,如果互斥锁始终由特权进程创建,则仍可以使用此功能。在这种情况下,您可以修改使用OpenMutex打开现有命名互斥锁的代码作为文档提示。

在具有所需权限的用户

下运行该流程可能更容易