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

Réseau C Discussion :

probleme socket C [deconnect-reconnect]


Sujet :

Réseau C

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut probleme socket C [deconnect-reconnect]
    salut a tous , je vous expose mon problème donc

    j'ai connecté mon socket .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    		....
                    monsock = socket(AF_INET,SOCK_STREAM,0);
     
    		connect(monsock , (SOCKADDR*)&configsock, sizeof(configsock));
    .....
    et dans un while(1) ; beaucoup de commandes et des threads sont mises en place . dont =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    				.....
    while( recv(monsock ,bufferirc , sizeof(bufferirc),0 ) < 0 )
    .....
    qui me sert a voir quand le SOCKET est déconnecté mais il bug beaucoup et fonctionne pas correctement car il pose problème au 1er while .

    Mes questions =
    - y'a t'il un moyen autre de vérifier la déconnection d'un socket ? si oui lequel?
    - y'a t-il en C socket une fonction qui le gere automatiquement genre ( disconnectsocket() ) ? si oui syntaxe sil vous plait
    - autre méthode /organisation de mon code ?


    Ps : quand je dit deconnection + reconnection , c'est si la connection est rompu , le socket après un Sleep se reconnect automatiquement bien sure ( closesocket(); socket(); connect() ; ... ec etc )

    merci

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Regarde du côté de la fonction select, ça va beaucoup t'aider. Et ça t'évitera d'avoir plein de threads dans ton programme. Sache toutefois que sous Windows, select ne peut être utilisée qu'avec des sockets et seulement des sockets. Sous Linux elle peut-être utilisée avec des fichiers aussi.

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut
    ok merci mais quand j'utilise le select() sa sera sur la condition de deconnection ou sur le sock qui recv() < 0; ??
    je sélectionne quoi ?
    ( pas compris le principe désolé )

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    De mémoire le select est bloquant est regroupe les différentes socket sur lequel nous pouvons lire, dans un petit tableau.
    Lorsque le select est débloqué, c'est qu'il y a eu de l'activité sur un des sockets que l'on surveille.

    De mémoire, lorsqu'une socket est deconnecté, on reçoit un 0 dessus ... donc le select va l'indiquer, car il va être débloqué puis va recevoir le 0 avec recv ... et donc on sait qu'il y a un problème.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut
    c est toujours autant bloqué avec select()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if( select(monsock + 1, NULL, NULL, &exceptfds, NULL)  == 0 )
    							{
    		if( recv(monsock ,bufferirc , sizeof(bufferirc),0 ) < 0 )
    								{  .....
    avec un exceptfds bloquante mon rcv() , un readfds

    me donne le meme probleme comme si j'avais pas utilisé de select() :s:s:s

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    select est toujours bloquant.
    Pour le débloquer, il faut recevoir des données sur les sockets.

    De plus, j'oserais dire que vous l'utilisez mal, car vous devriez passer des valeurs en 2ième argument ... enfin je pense.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    select est toujours bloquant.
    , on peut spécifier un timeout : man select
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    , on peut spécifier un timeout : man select
    Oui

    Mais de la cas de l'utilisateur actuel, il n'a pas mis de timeout (j'essaie de me rattraper )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  9. #9
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut
    merci de vos réponses , mais elle ne sont que théoriques ( concerne la fonction selection et non mon probleme )

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Pratiquement, gérer l'ensemble des cas est relativement complexe (le socket peut être gelé, le client (ou le serveur) peut être interrompu, etc etc)..

    En pratique, ce que je fait est (mais moi j'utilise des sockets asynchrones) :


    • utiliser un "poll" (sous unixoides, un WSApoll sous Windows) pour savoir si le socket est toujours "vvant" avant de faire une lecture ou écriture

    • utliser le signal handler pour gérer les signaux "généraux" (SIGTERM, SIGHUP, SIGQUIT, SIGKILL, SIGINT..)

    • utiliser un timer et aller vérifier toutes les X secondes l'état (via le poll) de "vie"..




    Maintenant, avec un socket bloquant, la question du timer disparait.

    Par contre, avant toute écriture ou lecture les "polls" doivent être effectués (car ils ne crashent pas alors que recv ou send crashent)


    Il y a une fonction shutdown..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Pour info, sous unixoide ma routine de vérifcation est la suivante :


    Code C : 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
     
    /*
     * C h e c k s _ C o m m u n i c a t i o n
     *
     */
    static int Checks_Communication ( void )
    {
       int             s, ncar_a_lire, ss ;
       struct pollfd   fds[2] ;
     
       fds[0].events = POLLOUT ;
       fds[1].events = POLLIN ;
     
    /*
    --- Assigns the values for the server to be checked
    */
       fds[0].fd = Canal_Out ;
       fds[1].fd = Canal_In ;
     
    /*
    --- Checks the state of the connection
    */
       s = poll (fds, 2, 200 );
     
    /*
    --- Either if failed (busy, frozen, error, or client hangup)
    */
       if ( (s <= 0) || 
            (fds[0].revents & POLLERR) || (fds[1].revents & POLLERR) )
         {
           if ( s <= 0 )
    	 s = INFO ;
           else
    	 s = WARNING ;
         }
       else
           if ( (fds[1].revents & POLLHUP)|| (fds[0].revents & POLLHUP) ||
                (fds[1].revents & POLLNVAL)|| (fds[0].revents & POLLNVAL) )
    	   s = ERROR ;
           else 
    	 {
    	   /* Otherwise it is ok to try and write on it */
     
    	   ss = ioctl(fds[1].fd, FIONREAD, &ncar_a_lire);
    	   if ( (ncar_a_lire == 0) && (ss >= 0) && 
                    (s == 2) && (fds[1].revents & POLLIN) )
    	      s = ERROR ;
    	   else
    	       s = SUCCESS ;
    	 }
     
       return (s);
    }

    et je m'en sers comme :



    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      if ( (i = Checks_Communication ()) == SUCCESS )
        {
            s = send.... (..);
         }
     else 
        {
          if ( (i == ERROR) || (i == WARNING) )
             {
    	   fprintf (stderr, "\nCLIENT SHUTDOWN THE COMM. SO COULD NOT WRITE !!!");
     
    	   End_Of_Session(2) ;
             }
        }


    Maintenant, pour les signaux, je fais :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      signal(SIGKILL,(void (*)())End_Of_Session);
      signal(SIGTERM,(void (*)())End_Of_Session);
      signal(SIGQUIT,(void (*)())End_Of_Session);
      signal(SIGPIPE,(void (*)())End_Of_Session);
      signal(SIGSTOP,(void (*)())End_Of_Session);
      signal(SIGHUP,(void (*)())End_Of_Session);


    et

    Code C : 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
    static void End_Of_Session ( int sig )
    {
      char   Cmd[40] ;
      int    pid, i, s ;
     
     
    /*
    --- Disconnect the sockets
    */
       shutdown(Canal_In ,2);
       close(Canal_In);
       shutdown(Canal_Out ,2);
       close(Canal_Out);
     
    /*
    --- Kills and deconnect actual server
    */
       pid = getpid();
       sprintf ( Cmd, "kill -9 %d",pid);
       pid = system(Cmd);
       exit(0);
    }
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  12. #12
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut
    merci pour l'aide , ta méthode à est bien complexe je vais l'étudier au moins pour utiliser le poll() déjà car je pense qu'elle pourra résoudre mon soucis .


    Il y a une fonction shutdown.. = c'est a dire ? je sais qu'elle est utiliser pour déconnecté une socket mais dans ton sens , vous voulez dire quoi ?

  13. #13
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Shark9 Voir le message
    merci pour l'aide , ta méthode à est bien complexe
    J'ai bien précisé au début qu'avoir des tests propres et complets des cas de déconnexion n'était pas simple...


    Citation Envoyé par Shark9 Voir le message
    Il y a une fonction shutdown.. = c'est a dire ? je sais qu'elle est utiliser pour déconnecté une socket mais dans ton sens , vous voulez dire quoi ?
    http://man.developpez.com/man2/shutdown.2.php
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  14. #14
    Membre du Club
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    82
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 82
    Points : 57
    Points
    57
    Par défaut
    ok donc le tout est de d'abord définir l'état du socket avant de faire quoi que se soit ok pour moi c est WSAPOLL vue que c est sur win que je code.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 41
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    @souviron34: A quoi correspondent les constantes INFO, WARNING, ... ?

    Merci

  16. #16
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Gaspoute Voir le message
    @souviron34: A quoi correspondent les constantes INFO, WARNING, ... ?
    bah, juste à donner des indications pour les messages - et/ou les logfile et/ou le type de fenêtre de messages - à afficher en fonction de la gravité :

    • gravité nulle : c'est une info, un message sans aucune conséquence, juste par exemple sur l'avancement d'une tâche, ..
    • gravité un peu plus forte : warning : quelque chose s'est mal passé, mais le soft peut continuer. Mais on peut vouloir le signaler.
    • gravité plus lourde : error : quelque chose s'est très mal passé, n'empêche pas le fonctionnnement de l'ensemble du sof, mais empêche le fonctionnement de cette fonctionalité. Il faut le signaler.
    • gravité encore plus lourde : fatal error : quelque chose s'est très très mal passé et empêche le soft dans son ensemble de fonctionner.


    Normalement, aucun cas de fatal error ne doit jamais pouvoir être mis.. Donc normalement FATAL_ERROR ne doit jamais figurer dans le code, uniquement dans les définitions.

    Un système sûr se doit de pouvoir récupérer sans planter, quiitte à ne pas disposer (même si c'est temporairement) de toutes les fonctionalités.

    donc par exemple :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SUCCESS 1
    #define INFO 0
    #define WARNING -1
    #define ERROR -2
    #define FATAL_ERROR -2

    On chosiit en général SUCCESS comme 1 pour faciliter les tests par analogie avec les booléens (et être commun avec le mécansisme de retour de main):

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( Fonction(..) == SUCCESS )
    qu'on pourrait (mais ce n'est pas le cas parce que c'est un int) écrire



    Après ça dépend, on peut faire le contraire :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SUCCESS 0
    #define INFO 1
    #define WARNING 2
    #define ERROR 3
    #define FATAL_ERROR 4

    mais à ce compte-là il faut systématiquement tester et ne jamais penser à l'analogie booléenne..

    Sinon on peut aussi catégoriser juste succès et erreur, et voir les autres comme des sous-catégories de ERROR :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define SUCCESS 0
    #define ERROR 1
    #define INFO 2
    #define WARNING 3
    #define NORMAL_ERROR 4
    #define FATAL_ERROR 5
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

Discussions similaires

  1. Probleme socket requete POST
    Par killuaster dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 15/10/2006, 15h15
  2. [Système] Probleme Socket Php
    Par Reaggaman dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2006, 18h55
  3. Problemes socket
    Par Proxius dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/07/2005, 14h25
  4. Probleme socket
    Par Spolix dans le forum Réseau
    Réponses: 6
    Dernier message: 03/10/2003, 06h50

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