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

POSIX C Discussion :

[C/S] Boken Pipe


Sujet :

POSIX C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Par défaut [C/S] Boken Pipe
    Bonjour a tous !

    Je developpe une application Client/Serveur.

    Pour les connaisseurs, cote serveur, tout de suite apres mon accept(), je verifie l'adresse du clientm afin de l'autoriser ou pas.... s'il n'est pas autorise, je lui renvoie un message d'erreur et je ferme le socket de commnication ... voici le bout de code :

    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
     
    ...
    if((talksock = accept(consock, (struct sockaddr*) &cli_addr, &addrlen))==-1)
    	erreur("Error@main: accepting the TCP connection.");
     
    if(cli_addr.sin_addr.s_addr != my_addr.sin_addr.s_addr)
    {
    	write(talksock, "Vous n'etes pas un client autorise!", strlen("Vous n'etes pas un client autorise!") +1);
     
    	close(talksock);
    }
    else
    {
    	// gestion du client
    }
    ...
    Le probleme, c'est que du cote client, lors de son read, il recoit un Broken Pipe, etant donne que le serveur a ferme la connexion (close(talksock)).... est-ce normal, et si oui, comment contourner ce probleme proprement ?

    Merci d'avance !

  2. #2
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 379
    Billets dans le blog
    1
    Par défaut
    Merci d'être plus précis : OS et problème rencontré.

    Tu veux dire que ton client est tué par un signal SIGPIPE si tu es sous Unix ? Si c'est bien ça, tu as deux solutions :
    Ignorer le signal SIGPIPE
    Utiliser recv et l'option MSG_NOSIGNAL à la place de read

    Bien entendu dans les deux cas il faudra tester la valeur de retour de read ou recv, respectivement.

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Par défaut
    Bonjour,

    Il serai peut etre utile de temporiser le close pour permettre
    au socket d'envoyer le message avant d'etre fermé?

    Cordialement

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Par défaut
    En reponse a Anomaly :

    Oui, je suis sous Linux/Unix ...
    Mais le probleme, si j'ai bien compris la doc de read() (a voir pour recv()), meme si j'ignore le signal, la fonction va tout de meme sortir en erreur, i.e. renvoyer EPIPE. Du coup, elle ne lira pas le reste du message qui traine dans la socket ( ou aussi le pipe).

    Mais je vais relire la man de recv() pour verifier.... ce qui me gene, c'est de devoir changer pas mal de code si effectivement recv() s'avere utilisable.....


    En reponse a pipin :

    Bein je suis d'accord avec toi... mais d'une part, tu ne sais pas combien de temps le message mettra pour arriver au destinataire (sachant que je bosse en reseau), et d'autre part c'est pas tres intelligent de faire attendre le processus serveur pour closer cette socket, ne serait-ce que pour 1 seconde.... (le serveur doit toujours etre dispo pour repondre a ses clients...)
    Et dela a creer un processus "fermeur de socket" qui recupererai la socket, et la fermerai au bout de n secondes, c'est bizzare comme solution je trouve ;)


    Des remarques alors ?

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Par défaut
    Autant pour moi, Broken Pipe arrivait lorsque mon client tentait d'ecrire sur la socket.... mais le probleme reste a peu pres identique.

    J'ai change tout mon code avec des recv() et de send(), sachant que c'est normalement plus adapte aux sockets.

    Et puis j'ai aussi migre ma fermeture de socket dans un autre process, le process qui gere les client... du coup, meme si c'est un client interdit, il y aura tout de meme un fork() de fait pour le gerer ( lire sa requete, puis lui refuser...)

    Faudra que j'envisage de passer a des threads, histoire d'alleger le tout !

    Bon, bein je vous remercie pour vos remarques.. a la prochaine !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/02/2004, 14h35
  2. Réponses: 3
    Dernier message: 06/02/2004, 11h46
  3. Pipes - Comment faire ?
    Par Neitsa dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 11/12/2003, 05h44
  4. Réponses: 3
    Dernier message: 21/08/2003, 14h47
  5. Problème : bloquage d'un pipe
    Par Nicaisse dans le forum POSIX
    Réponses: 10
    Dernier message: 24/07/2003, 11h06

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