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 :

Fonction send (et surement recv) "quittant" l'application


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut Fonction send (et surement recv) "quittant" l'application
    Bonjour,

    Lors d'un développement d'un programme utilisant les sockets en c sur linux (ubuntu 9.10) j'ai rencontrée un problème.

    J'ai une partie serveur (qui fait le listen et accepte une connexion) et ensuite envoie en boucle infini un message (disons de taille 4) à mon destinatire.

    J'ai une partie cliente (qui se connecte à mon serveur) et reçoit en boucle infini le message (de taille 4 aussi!)

    Pour le moment aucun problème le client lit bien ce qu'envoie le serveur.

    Lorsque je quitte l'application client (en faisant ctrl+c) ben mon serveur s'arrête de manière très bizarre. En effet la méthode send semble quitter mon application

    Voici le code de l'envoie du serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    printf("Before");
    n = send(sock,&test2,sizeof(struct test),0);
    printf("After");
    if (n < 0)
    {
    	perror("ERROR writing to socket");
    	exit(1);
    }
    Quand je dis de manière très bizarre c'est que dans la console j'ai

    Before
    After
    ...
    Before

    Et c'est tout! Comme si la méthode send a décidé de quitter mon application

    Alors qu'en faite je pensais avoir comme sortie

    Before
    After
    ...
    Before
    After
    ERROR writing to socket: Connection reset by peer

    Est-ce normal le comportement que j'obtiens? Si oui pourquoi? Et aussi au passage si vous avez un moyen de contourner la fin brutal de mon application.

    En faisant des tests j'ai remarqué que si le client lit un message de taille 3 et que le serveur envoie tjrs un message de taille 4 ben j'obtiens la sortie d'erreur (mais PAS quand c'est la même taille), d'où le faite que je pense fortement à un problème dans le send.

    Merci d'avance

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


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

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 122
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Pour savoir ce qui se passe réellement dans le programme, je vous conseille de démarrer le programme dans strace:
    strace ./votre_programme
    Il permet d'afficher tout les appels systèmes ( ultra pratique dans ce cas là ).

    Moi aussi, je me serai attendu à un "reset by peer", mais bon ...

    ( Et ce n'est pas un bug dans le send, et comme vous l'utiliser sans flags ( voir documentation ) , vous auriez pu utiliser un write() )
    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.

  3. #3
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 2
    Par défaut
    J'ai essayé votre commande et effectivement ça m'a bien aidé.

    Lorsque la taille est identique la fonction send (ou writeça donne le même comportement) retourne bien -1 mais l'erreur est un EPIPE qui génère un signal SIGPIPE et comme je ne capture pas les signaux le programme s'arrête.

    Je suppose que d'ignorer le signal devrait empêcher le programme de s'arrêter.

    Je vais continuer mes tests, merci pour votre commande et pour votre aide!

    Au passage pour les intéressé en ajoutant 0|MSG_NOSIGNAL comme flag a send et le signal n'est plus envoyé

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/05/2007, 09h12
  2. Question sur les fonctions "send()" et "recv(
    Par damien99 dans le forum MFC
    Réponses: 6
    Dernier message: 10/02/2006, 20h47

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