Повысьте Asio, если условие оценивается по-разному в статических компиляторах lib и dll, что приводит к исключению в lib io cpp клиента socket

В зависимости от того, как библиотека socketio c ++ скомпилирована (static-lib или dll) для следующего простого тестового кода, результатом может быть либо рабочий исполняемый файл, либо тот, который выдает исключение.

Тем не менее, если экземпляр io_service закомментирован, например:

// boost :: asio :: io_service io_service;

тогда версия на основе статической библиотеки также работает без исключения. Похоже, что существует некоторая интерференция между io_service, созданным в main (), с io_service, расположенным в библиотеке socketIO.

#define BOOST_ALL_NO_LIB

#include "../socketio/src/sio_client.h"
#include <boost\asio\io_service.hpp>
#include <memory>
#include <fstream>
#include <string>
#include <boost/lexical_cast.hpp>


int main(int argc, char* argv[]) {
    boost::asio::io_service io_service;
    //auto io_service_work = std::make_shared<boost::asio::io_service::work>(io_service);
    sio::client client_;
    client_.connect("http://localhost:1337");
    //io_service.run();
}

Хотя полный исходный код остается тем же (не считая необязательных различий условной компиляции), оценка следующей строки дает TRUE в static-lib и FALSE в версии Dll:

if (! :: PostQueuedCompletionStatus (iocp_.handle, 0, 0, op))

Проверьте полный код из win_iocp_io_service.ipp

void win_iocp_io_service::post_deferred_completion(win_iocp_operation* op)
{
  // Flag the operation as ready.
  op->ready_ = 1;

  // Enqueue the operation on the I/O completion port.
  if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, op)) // DIFFERENT RESULT IN STATIC-LIB AND DLL
  {
    // Out of resources. Put on completed queue instead.
    mutex::scoped_lock lock(dispatch_mutex_);
    completed_ops_.push(op);
    ::InterlockedExchange(&dispatch_required_, 1);
  }
}

Пожалуйста, найдите тестовый пакет с двумя почти идентичными решениями VS2015. Оба решения содержат 2 проекта (siotest и socketio). Пакет должен быть автономным, поэтому для компиляции и тестирования не требуется никаких дополнительных библиотек (таким образом, размер файла zip несколько больше).

Zip-файл, содержащий тестовый пакет

Socketio - это библиотека, включающая в себя реализацию клиента с открытым исходным кодом c ++ 11 socket.io от

Клиентская реализация Socket IO C ++ 11

Siotest - это простая тестовая программа, которая подключается к серверу socketIO.

И Socketio, и Siotest используют boost asio ioservice, хотя инстанцированная переменная io_service в Siotest не используется после создания экземпляра.

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

Эти выходные данные являются результатом решения siotest_dll, которое считается ожидаемым поведением для исполняемого файла.

Другая версия решения в папке siotest lib практически полностью идентична, но связывание проекта socketio - статическая библиотека, а не динамически связанная библиотека в siotest dll.

Результат ошибочного запуска socketio_lib показан в скриншоте ниже

При отладке двух версий создается впечатление, что при компиляции в режиме Dll создается новый поток для внутреннего io_service socketio, но в статической версии lib не создается новый поток, поскольку перед созданием нового потока версия static-lib выдает исключение.

Между этими двумя версиями программного обеспечения существует определенная разница, хотя исходный код точно такой же. Этот пример является упрощением нашей программной среды, в которой мы хотели бы использовать как клиентскую библиотеку C ++ для IO-сокетов, так и Boost Asio IO Service.

Мы хотели бы понять источник проблемы и иметь возможность скомпилировать наш код в виде статической библиотеки. Любые советы высоко ценится.

Ответы на вопрос(0)

Ваш ответ на вопрос