Impulse Asio si la condición se evaluó de manera diferente en las compilaciones static-lib y dll, lo que resultó en una excepción en el socket io cpp client lib

Dependiendo de cómo se compila la biblioteca de socketio c ++ (static-lib o dll) para el siguiente código de prueba simple, el resultado es un ejecutable que funciona o uno que arroja una excepción.

Sin embargo, si se comenta la instanciación del servicio io_service, por ejemplo:

// boost :: asio :: io_service io_service;

entonces la versión basada en static-lib también funciona sin excepción. Parece que hay alguna interferencia entre el io_service instanciado en main () con el io_service ubicado en la biblioteca 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();
}

Aunque el código fuente completo es el mismo (sin contar las diferencias de compilación condicional opcionales), la evaluación de la siguiente línea resulta VERDADERO en static-lib y FALSO en la versión Dll:

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

Verifique el código completo de 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);
  }
}

Encuentre un paquete de prueba con dos soluciones VS2015 casi idénticas. Ambas soluciones contienen 2 proyectos (siotest y socketio). El paquete debe ser autónomo, por lo que no se necesitan bibliotecas adicionales para compilar y probar (por lo tanto, el tamaño algo mayor del archivo zip).

Archivo zip que contiene el paquete de prueba

Socketio es una biblioteca que abarca la implementación de cliente de código abierto c ++ 11 socket.io de

Implementación del cliente Socket IO C ++ 11

Siotest es un programa de prueba simple, que se conectaría a un servidor socketIO.

Tanto Socketio como Siotest usan el asio ioservice, aunque la variable io_service instanciada en Siotest no se usa después de la instanciación.

En el caso de prueba que se usó para demostrar el problema, no hay un servidor socketio de escucha, por lo que el comportamiento esperado es mensajes de Error de conexión como se muestra en la siguiente captura de pantalla, porque el cliente no puede conectarse a ningún servidor.

Este resultado es el resultado de la solución siotest_dll, que se considera el comportamiento esperado para el ejecutable.

Otra versión de la solución en la carpeta lib de siotest es casi completamente idéntica, pero la vinculación del proyecto socketio es una biblioteca estática en lugar de una biblioteca vinculada dinámica en el dll siotest.

El resultado de la ejecución errónea de socketio_lib se muestra en la captura de pantalla a continuación

Al depurar las dos versiones, parece que cuando se compila en modo Dll, se crea un nuevo subproceso para el io_service interno de socketio, pero no se crea un nuevo subproceso en la versión estática lib, porque antes de crear el nuevo subproceso, la versión static-lib arroja un excepción.

Claramente, hay alguna diferencia entre las dos versiones del software, aunque el código fuente es exactamente el mismo. El ejemplo es una simplificación de nuestro marco de software en el que nos gustaría utilizar tanto la biblioteca C ++ de socket IO client como el servicio Boost Asio IO.

Nos gustaría entender el origen del problema y poder compilar nuestro código como biblioteca estática. Cualquier consejo es muy apreciado.

Respuestas a la pregunta(0)

Su respuesta a la pregunta