Question

J'utilise gsoap pour créer un serveur SOAP en C ++. Les messages sont acheminés via un bus écrit en Java. Le serveur et le bus sont multithreads. Tout fonctionne bien en envoyant un message à la fois dans le système. Si je lance 3 clients, chacun envoyant des messages aussi rapidement que possible, tout va bien pour environ 3 500 messages. Ensuite, je commence à recevoir des notifications périodiques "Une seule connexion de socket est autorisée à la fois". erreurs du code gsoap. En règle générale, environ 3 950 messages sur 4 000 passent à OK. Avec les 50 échecs survenus lors des 500 derniers envois.

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

  2. De quoi parle-t-on? Je ne trouve aucune explication à cette erreur et sa signification ne m'est pas claire.

  3. Quelqu'un a-t-il multithread avec succès une application gsoap?

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

;
}
Était-ce utile?

La solution

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

Après avoir copié la structure soap avec soap_copy () , je pense qu'elle doit être libérée en appelant tous les:

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

L’appel manquant à soap_done () (appelé à partir de soap_free () ) appelle soap_closesock () , ce qui ferme le prise.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top