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.

  1. Perché questi errori dovrebbero verificarsi dopo molti invii, ma non all'inizio dell'invio? La velocità di invio non aumenta.

  2. Di cosa sta parlando? Non riesco a trovare alcuna spiegazione dell'errore e il suo significato non mi è chiaro.

  3. 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

;
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top