Закрыть соединение 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", но безуспешно.
Большое спасибо!