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 :

connect suivi de close plante mon serveur


Sujet :

Réseau C

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut connect suivi de close plante mon serveur
    bonjour,
    j'écris pas à pas un mécanisme client/serveur TCP pour tenter de bien comprendre.
    Le client envoi une structure Operandes contenant les opérandes et l'opération à effectuer.
    Le code du serveur en l'état, suite à un accept, le pgm instancie un fils pour servir le client qui vient de se connecter (1 seul client pour le moment):
    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
     
    case 0:
            //processus fils
    	while(!terminated)
    	{
    	  int n = 0;
    	  if((n = recv(csock, &operandes, sizeof(struct Operandes), 0)) < 0)
    	  {
    	    perror("recv()");
                terminated = 1;
    	  }
    	  else
    	  {
    	    printf("Receive %d %c %d (%d octets) from %s\n", operandes.op1, operandes.operation, operandes.op2, n, inet_ntoa(csin.sin_addr));
    	    //calcul et envoi du résultat
    	    switch(operandes.operation)
    	    {
    	      case 'q':
    		terminated = 1;
    		break;
    	      case '+':
    		result = operandes.op1 + operandes.op2;
                    n = write(csock, &result, sizeof(result));
    		break;
                  case '-':
                    //etc......
    	    }
    	  }
    	}
    	printf("Deconnexion...\n");
    	close(csock);	//fermeture de la socket de service
    	exit(0);
    Ca fonctionne comme voulu sauf que je me suis aperçu que si le client fait un appel à connect() suivi immédiatement d'un close() de la socket, le serveur tourne sans fin dans la boucle while() en affichant:
    Receive 0 0 (0 octets) from 127.0.0.1
    Receive 0 0 (0 octets) from 127.0.0.1
    Receive 0 0 (0 octets) from 127.0.0.1
    Je ne comprend pas pourquoi, j'ai crû lire dans la doc de recv() qui est bloquante par défaut qu'elle détectait une déconnexion du client en retournant une valeur < 0.
    Si quelqu'un peut me corriger ??
    Merci.

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    https://linux.die.net/man/3/recv

    If no messages are available to be received and the peer has performed an orderly shutdown, recv() shall return 0.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/12/2007, 13h15
  2. Erreur de connection a mon serveur Db2
    Par mr.net dans le forum DB2
    Réponses: 2
    Dernier message: 06/08/2007, 18h42
  3. se connecter à mon serveur FTP
    Par younek dans le forum Protocoles
    Réponses: 7
    Dernier message: 10/01/2007, 11h36
  4. Voir liste des connectés à mon serveur Apache
    Par dj-julio dans le forum Apache
    Réponses: 2
    Dernier message: 13/12/2006, 11h25
  5. Réponses: 4
    Dernier message: 06/07/2006, 17h14

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