0 votes

Erreur Gsoap en C++

J'utilise gsoap pour créer un serveur soap en C++. Les messages sont acheminés par un bus écrit en Java. Le serveur et le bus sont tous deux multithreadés. Tout fonctionne bien lorsqu'on envoie un message à la fois dans le système. Si je lance 3 clients qui envoient chacun des messages aussi vite que possible, tout va bien pendant environ 3500 messages. Ensuite, je commence à recevoir des erreurs périodiques "Only one socket connection allowed at a time" du code gsoap. En général, environ 3950 des 4000 messages passent sans problème. Les 50 échecs se produisent dans les 500 derniers envois.

  1. Pourquoi ces erreurs se produisent-elles après de nombreux envois, mais pas au début de l'envoi ? Le taux d'envoi n'augmente pas.

  2. De quoi parle-t-il ? Je ne trouve aucune explication à cette erreur et sa signification n'est pas claire pour moi.

  3. Quelqu'un a réussi à faire fonctionner une application gsoap en multithread ?

Voici le code de mon serveur.

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

;
}

1voto

Scott Lundberg Points 2354

Je crois que vous avez une fuite de ressources dans threadGO.

Après avoir copié la structure du savon avec soap_copy() je crois qu'il faut le libérer en appelant tous les :

soap_destroy(x);
soap_end(x);
soap_free(x);

Plus précisément, l'appel manquant à soap_done() (qui est appelé à partir de soap_free() ) appelle soap_closesock() qui ferme le socket.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X