2014-12-22 4 views
1

Я пытался узнать, есть ли у кого-нибудь еще эта проблема, но я еще ничего не нашел в сети. Что-нибудь в этом коде выглядит так, будто я вызываю boost неправильно?Boost Asio Error

Этот код работает, когда я вошел в систему, на которой запущен 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, код работает правильно, но я думаю, что это может повлиять на другую ошибку в моем коде. Поэтому я пытаюсь использовать последнюю логику SSL от Boost.

Любая помощь будет оценена!

+0

«когда никто не вошел в машину» вы начинаете процесс по-другому? Кроме того, на какой платформе вы запускаете это (я не могу поверить, что вы не упомянули об этом существенном бите информации в сообщении ...) – sehe

+0

Извините за то, что вы не включили сценарий и среду. Это выполняется в Windows 7. Процесс запускается с удаленного компьютера, подключенного к демону, который запускает другую программу в качестве удаленного пользователя (с их учетными данными). Эта финальная программа - это проблема с TCP-сервером. – Snowman6286

ответ

2

Я собираюсь предположить из симптомов, которые вы запускаете в Windows.

На окнах, static_mutex реализован в виде имени (межпроцессного) мьютекса и получает «открыт» с помощью CreateMutexW:

Если мьютекс именованный мьютекс и объект существовал до этого вызова функции, то return value - это дескриптор существующего объекта, GetLastError возвращает ERROR_ALREADY_EXISTS, bInitialOwner игнорируется, а вызывающему потоку не предоставляется право собственности. Однако, , если вызывающий абонент имеет ограниченные права доступа, функция завершится с ERROR_ACCESS_DENIED, и вызывающий абонент должен использовать функцию OpenMutex.

Как вы видите, у вас нет необходимых разрешений. Однако вы все равно можете работать, если мьютекс всегда создается с помощью привилегированного процесса. В этом случае вы можете изменить код, который открывает существующий именованный мьютекс с OpenMutex в качестве подсказок документации.

Это, скорее всего, будет проще запустить процесс под пользователя, который имеет необходимые разрешения думали

+0

Это звучит как разумное объяснение. Кажется, это будет ошибкой в ​​Boost, поскольку я не называю CreateMutex или OpenMutex напрямую. Ты бы согласился с этим? – Snowman6286

+0

@ Snowman6286 Я бы не согласился с этим. Тот факт, что библиотека реализует функции, требующие разрешений, не является ошибкой. Однако вы могли бы спросить у разработчиков библиотеки, что они смогут получить более авторитетный ответ – sehe