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 :

[Socket] Reconnexion automatique du client


Sujet :

Réseau C

  1. #1
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut [Socket] Reconnexion automatique du client
    Salut

    Je vous explique en quelques mots mon client : il tente une connexion vers un serveur toutes les 30secondes. Une fois la connexion etablit il s'endort jusqu'à la fermeture du serveur et recommence à tenter une connexion.
    Petite precision, le serveur et le client ne sont pas dans le meme reseau.

    Voici le code principal :

    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
     
    while(1)
    	{
    		int ret;
    		char buffer[2048];
    		SOCKET sock;
    		struct sockaddr_in addrServ;
    		struct hostent *hote;
     
    		/* création socket */
    		sock = socket(AF_INET, SOCK_STREAM,0);
    		if ( sock == INVALID_SOCKET )
    			exit(3);
    		/*Connection au serveur */
    		addrServ.sin_family = AF_INET;
    		hote = gethostbyname(dns);
    		addrServ.sin_addr.s_addr = *(unsigned int*)(hote->h_addr_list[0]);
    		addrServ.sin_port = htons(port);
    		while ( connect(sock,(struct sockaddr *) &addrServ,sizeof(addrServ)) == SOCKET_ERROR ){
    			sleep(30000);
    		}
    		/* serveur connecté ! on lui envoit un msg */
    		send(sock,msg,sizeof(msg),0);
    		while ( recv(sock,buffer,sizeof(buffer),0) != SOCKET_ERROR )
    		{
    			sleep(1);
    		}
    		close(sock);
    	}
    /* liberation reseau */
    #if defined (_WIN32)
       WSACleanup();
    #endif
    Ca fonctionne bien, le seul problème est quand il y a une déconnexion de l'internet coté client, celui ci ne reprend plus ses tentatives de connexion au serveur une fois sa connexion internet retablit (en gros il tente de se connecter, je coupe ma livebox, je rebranche, il ne tente plus rien..).

    Voilà, j'espère que ce problème a une solution (je ne vois pas pourquoi il n'en aurait pas), mais j'ai pas reussit à la trouver

    Merci pour votre aide
    Sorry
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Rajoute un perror quand la connexion ne réussi pas quand tu n'a plus le net pour voir le message.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Je pense avoir trouvé, en tout cas un problème venait de recv qui est bloquant.

    J'ai donc mis un select pour contourner le problème du recv bloquant. Apparemment ça a l'air de marcher mais j'ai pas le temps de vraiment tester (semaine d'exams...), je verrai ça vendredi
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  4. #4
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    En fait ce qui serait parfait, c'est une fonction pour savoir si la socket est toujours un file descriptor correct ou non..

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( maSock == bad file descriptor )
      // il y a eut deconnexion
      // retour à la reconnexion au serveur
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu tentes un dup et si tu as une erreur EBADF, c'est qu'il est pas valide.

    Bon c'est du bidouillage mais y'a peut-être autre chose.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  6. #6
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par Skyrunner
    Tu tentes un dup et si tu as une erreur EBADF, c'est qu'il est pas valide.
    késako ??

    En attendant de trouver mieux, j'ai mis ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ( send(sock,NULL,0,0) == SOCKET_ERROR )
       // il y a eut deconnexion
      // retour à la reconnexion au serveur
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  7. #7
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    man dup

    dup et dup2 créent une copie du descripteur de fichier oldfd.
    dup et dup2 renvoient le nouveau descripteur, ou -1 s'ils échouent, auquel cas errno contient le code d'erreur.
    Erreurs

    EBADF
    oldfd n'est pas un descripteur valide, ou newfd n'est pas dans les valeurs autorisées pour un descripteur.
    Tu tentes de copier ton descripteur mais si il n'est pas valide ca echouera et tu saura donc qu'il n'est pas valide. En revanche si il reussi oubli pas de fermer le nouveau descripteur
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  8. #8
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ( dup(sock) == -1 )
      // la socket n'est plus bonne
    Mais je passe dans le if meme quand la socket est bonne
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  9. #9
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par sorry60
    J'ai essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if ( dup(sock) == -1 )
      // la socket n'est plus bonne
    Mais je passe dans le if meme quand la socket est bonne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if ( (newfd = dup(sock)) == -1 )
    {
      if(errno == EBADF)
      {
         // la socket n'est plus bonne
       }
    }
    else
    {
       close(newfd);
    }
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  10. #10
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    Idem, à chaque passage ça rentre pourtant je ne fais rien : ni fermer le serveur, ni deconnecter ma connexion internet


    Edit : j'ai placé le test juste en dessous de sock = socket(...) pour voir, ça rentre aussi dans le if
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

  11. #11
    Membre actif Avatar de sorry60
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 802
    Points : 253
    Points
    253
    Par défaut
    J'ai repensé un peu mon algo car là je patauge pour detecter la perte de la connexion internet..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    tantque 1
       creer socket
       tant que connec(socket,serveur) echoue faire
          sleep(30000)
       fintantque
       fin = faux
       tant que fin = faux faire
          si le serveur se deconnecte alors fin = vrai
          sinon si le serveur n'envoie plus rien depuis Xmin alors fin = vrai
       fintantque
    fintantque
    Si je pleure encore qu'un jour tu me reviennes,
    C'est que sans toi je suis comme un Roi sans sa Reine.

Discussions similaires

  1. Client TCP/IP comment gérer une reconnexion automatique ?
    Par GGelec dans le forum Réseau/Web
    Réponses: 3
    Dernier message: 08/04/2013, 22h07
  2. Reconnexion automatique Client TCP
    Par abizot dans le forum Android
    Réponses: 1
    Dernier message: 22/10/2012, 13h46
  3. Reconnexion automatique du client SQL Server
    Par marsup077 dans le forum Administration
    Réponses: 2
    Dernier message: 11/04/2011, 13h19
  4. [Socket] Probleme entre un Client C et un serveur JAVA
    Par bpy1401 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 28/02/2006, 08h40
  5. [socket] port automatique
    Par hogan dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 18/07/2005, 21h22

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