提升 Asio 错误

Boost Asio Error

本文关键字:错误 Asio 提升      更新时间:2023-10-16

我试图看看是否有其他人遇到这个问题,但我还没有在网上找到任何东西。这段代码中的任何内容看起来我调用了不正确的提升吗?

此代码在我登录到启动 TCP 服务器的计算机时有效,但在没有人登录时失败。我把代码剥离下来,只看提升 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 逻辑。

任何帮助将不胜感激!

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

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

如果互斥锁是命名互斥锁,并且对象在此函数调用之前存在,则返回值是现有对象的句柄,GetLastError 返回 ERROR_ALREADY_EXISTSbInitialOwner将被忽略,并且调用线程不会被授予所有权。但是,如果调用方的访问权限有限,则该函数将失败并ERROR_ACCESS_DENIED,调用方应使用 OpenMutex 函数。

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

在具有所需权限的用户下运行该过程可能更容易