Закрыть соединение gsoap из другого потока

В многопоточном приложении, использующем Gsoap, я хочу закрыть вызов 'soap_get_connect' из другого потока.

В документации Gsoap говорится, что вызов 'soap_done' закрывает связь, но он не работает. Это пример кода

#include <thread>
#include <chrono>
#include "soapH.h"  
#include "ns1.nsmap"
#include "httpget.h"

#define TIME_OUT 90 //very high timeout

static bool keep_running;
static struct soap *soapInstance;

void connection()
{
    const char * endPoint = "http://example.com/";
    while (keep_running)
    {
        //if this call gets blocked, it is not unblocked by a soap_done call, when it should be
        if (soap_get_connect(soapInstance, endPoint, NULL))
        {
            printf("Error en soap_get_connect: %d\n", soapInstance->error);
            return;
        }

        if (soap_begin_recv(soapInstance) != SOAP_OK)
        {
            printf("Error en soap_begin_recv: %d\n", soapInstance->error);
            return;
        }

        soap_end_recv(soapInstance);
        std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    }
}

int main()
{
    char input[10];
    memset(input, 0, sizeof input);

    soapInstance = soap_new();
    soapInstance->recv_timeout = TIME_OUT;
    soapInstance->send_timeout = TIME_OUT;
    soapInstance->connect_timeout = TIME_OUT;
    soap_mode(soapInstance, SOAP_XML_IGNORENS | SOAP_C_UTFSTRING);
    soap_register_plugin(soapInstance, ::http_get);

    keep_running = true;
    std::thread runConnectionThread(connection);

    while (strcmp(input, "quit") != 0)
    {
        scanf("%s", input);
    }

    std::cout << "Stopping gsoap connections" << std::endl;
    soap_done(soapInstance);//this should end gsoap connections, but it is not working
    keep_running = false;
    runConnectionThread.join();

    soap_destroy(soapInstance);
    soap_end(soapInstance);
    soap_free(soapInstance);

    return 0;
}

Если вы запустите эту программу и отсоедините сетевой кабель, поток соединения будет заблокирован при вызове soap_get_connect. Затем, если вы наберете 'quit' для вызова 'soap_done' из основного потока, поток соединения не вернется из 'soap_get_connect'.

Как я могу заставить вызов 'soap_get_connect' вернуться из другого потока?

Я много взялся за это " как остановить операции gSOAP", но безуспешно.

Большое спасибо!

0 ответов

Другие вопросы по тегам