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.
-
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.
-
De quoi parle-t-on? Je ne trouve aucune explication à cette erreur et sa signification ne m'est pas claire.
-
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
;
}
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.