Domanda
Sto usando gsoap per creare un server soap in C ++. I messaggi vengono instradati attraverso un bus scritto in Java. Sia il server che il bus sono multithread. Tutto funziona bene inviando un messaggio alla volta attraverso il sistema. Se avvio 3 client ciascuno inviando messaggi il più velocemente possibile, tutto va bene per circa 3500 messaggi. Quindi comincio a ricevere periodicamente "Solo una connessione socket consentita alla volta." errori dal codice gsoap. Tipicamente circa 3950 di 4000 messaggi riescono a superare OK. Con tutti i 50 fallimenti che si verificano nelle ultime 500 mandate.
-
Perché questi errori dovrebbero verificarsi dopo molti invii, ma non all'inizio dell'invio? La velocità di invio non aumenta.
-
Di cosa sta parlando? Non riesco a trovare alcuna spiegazione dell'errore e il suo significato non mi è chiaro.
-
Qualcuno ha eseguito correttamente il multithreading di un'app gsoap?
Ecco il mio codice server.
long WINAPI threadGO(soap *x);
int main(int argc, char* argv[])
{
HANDLE thread1;
int m, s; /* master and slave sockets */
struct soap *soap = soap_new();
if (argc < 2)
soap_serve(soap); /* serve as CGI application */
else
{
m = soap_bind(soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for (;;)
{
s = soap_accept(soap);
thread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)threadGO,soap_copy(soap),0,NULL);
}
}
soap_done(soap);
free(soap);
return 0;
}
long WINAPI threadGO(soap *x)
{
soap_serve(x);
soap_end(x);
return 0
;
}
Soluzione
Credo che tu abbia una perdita di risorse in ThreadGO.
Dopo aver copiato la struttura soap con soap_copy ()
, credo che debba essere liberato chiamando tutto:
soap_destroy(x);
soap_end(x);
soap_free(x);
In particolare, la chiamata mancante a soap_done ()
(che viene chiamata da soap_free ()
) chiama soap_closesock ()
, che chiude il presa.