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

  1. #1
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    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 !
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  2. #2
    Responsable technique

    Avatar de Anomaly
    Homme Profil pro
    Directeur
    Inscrit en
    Juin 2003
    Messages
    10 332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Somme (Picardie)

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 332
    Points : 130 178
    Points
    130 178
    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.
    Responsable technique forum & site

    Si ce message (ou un autre) vous a aidé et/ou vous semble pertinent, votez pour lui avec

  3. #3
    Membre régulier

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 68
    Points : 93
    Points
    93
    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 du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    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 ?
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

  5. #5
    Membre du Club
    Inscrit en
    Mars 2002
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 88
    Points : 59
    Points
    59
    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 !
    "Dis oui à celui qui te dit non, et il te dira peut-être.", Gogoye - Les Proverbes à la Con

+ 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