Повысьте 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.
Мы хотели бы понять источник проблемы и иметь возможность скомпилировать наш код в виде статической библиотеки. Любые советы высоко ценится.