IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Threads & Processus C++ Discussion :

gsoap et timeout de sockets, requêtes


Sujet :

Threads & Processus C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut gsoap et timeout de sockets, requêtes
    Bonjour!

    Alors voici mon problème : j'ai créé un serveur gsoap qui fonctionne très bien avec une fonction qui peut être appelée par un client.
    Ce que je voudrais faire c'est rajouter un timeout au niveau du serveur qui interrompt l'exécution de la requête du client si celle-ci dépasse un temps donné.
    J'ai implémenté un serveur fourni dans le guide gsoap http://www.cs.fsu.edu/~engelen/soapdoc2.html (celui section 7.2.4, dans le 2eme cadre vert), mais je n'arrive pas à mettre le timeout dont j'ai besoin.
    J'ai essayé tout ce qui est soap.send_timeout et soap.recv_timeout mais ça ne donne rien, la requête est toujours exécutée entièrement et renvoyée au client quelque soit les valeurs (inférieures bien sûr au temps de ma requête). Je dois oublier quelque chose mais je ne vois pas.

    Voici le code du serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    /*
    ... définition de constantes...
    */
     
    int main( int argc, char **argv )
    {
     
      struct soap soap;
      soap_init(&soap);
     
      //specify the timeout values for non-blocking socket I/O operations. 
      soap.send_timeout = 20; //seconds
      soap.recv_timeout = 20; 
     
      soap.accept_timeout = 0;// 3600 : server stops after 1 hour of inactivity, 0 : server never stops
      soap.max_keep_alive = 100; // max keep-alive sequence
     
      struct soap *soap_thr[MAX_THR];
      pthread_t tid[MAX_THR];
      int port=NUM_PORT;
      SOAP_SOCKET m,s;
      int i;
      m=soap_bind(&soap,NULL,port,BACKLOG);
      if(!soap_valid_socket(m))
        exit(1);
     
      for(i=0;i<MAX_THR;i++)
        soap_thr[i]=NULL;
     
      for(;;)
        {
          for(i=0;i<MAX_THR;i++)
    	{
    	  s=soap_accept(&soap);
    	  if(!soap_valid_socket(s))
    	    {
    	      if(soap.errnum)
    		{
    		  soap_print_fault(&soap,stderr);
    		  continue;
    		}
    	      else
    		{
    		  fprintf(stderr,"Server timed out\n");
    		  break;
    		}
    	    }
     
    	  fprintf(stderr,"S : Socket %d : IP %d.%d.%d.%d : Thread %d\n",s,(soap.ip>>24)&0xFF,(soap.ip>>16)&0xFF,(soap.ip>>8)&0xFF,soap.ip&0xFF,i);
     
    	  if(!soap_thr[i])
    	    {
    	      soap_thr[i]=soap_copy(&soap);
    	      if(!soap_thr[i]){
    		exit(1);
    	      }
    	    }
    	  else
    	    {
    	      pthread_join(tid[i],NULL);
     
    	      soap_destroy(soap_thr[i]);
    	      soap_end(soap_thr[i]);
     
    	      fprintf(stderr,"Thread %d completed\n",i);
    	    }
     
    	  soap_thr[i]->socket=s;
    	  pthread_create(&tid[i],NULL,(void*(*)(void*))soap_serve,(void*)soap_thr[i]);
    	}
          }
     
      for(i=0;i<MAX_THR;i++)
        if(soap_thr[i])
          {
    	soap_destroy(soap_thr[i]);
    	soap_end(soap_thr[i]);
    	soap_done(soap_thr[i]);
    	free(soap_thr[i]);
          }
     
      return 0;
    }
     
    //la requete que le client peut appeler
    int ns__request(struct soap *soap, xsd__base64Binary* _param1, xsd__base64Binary* _param2, xsd__base64Binary& result){
     
    /* ... */
     
    }
    Merci pour votre aide, a+!

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je ne connais pas gsoap mais si j'en crois le lien que tu donnes, tes timers ont plus à voir avec la gestion des sockets sous-jacente qu'avec le temps d'exécution de ta fonction. En d'autres termes, j'ai l'impression que tu dois gérer à la main l'interruption du service côté serveur s'il n'arrive pas à s'exécuter dans le temps imparti.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 18
    Par défaut
    Bonjour,

    Merci pour votre réponse, je regarderai de nouveau la doc de gsoap plus en détails alors, parce que mon timeout doit être du côté serveur.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Timeout pour socket UDP
    Par parabole33 dans le forum C++
    Réponses: 5
    Dernier message: 15/10/2010, 20h22
  2. Définir un timeout sur une requête de récuperation
    Par xsight dans le forum Hibernate
    Réponses: 3
    Dernier message: 29/06/2010, 10h30
  3. Timeout des sockets asynchrones ?
    Par icareo dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 18/08/2009, 14h17
  4. Timeout d'une requête
    Par mambo dans le forum C++
    Réponses: 4
    Dernier message: 26/04/2007, 15h31
  5. TimeOut d'une requète SQL?
    Par moritan dans le forum Oracle
    Réponses: 2
    Dernier message: 16/06/2006, 10h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo