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 :

[Réseau] connexion client/serveur


Sujet :

Réseau C

  1. #21
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Quel est le type de nb_send ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    La j'ai juste remis la boucle dans laquelle ca plante, les définitions sont sur la page précédente (en bas de la page)

    Sinon pour nb_send

  3. #23
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    size_t est un type non-signé.
    Edit: Ça m'apprendra à me fier aux fonctions Win32...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #24
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Creuvard
    La j'ai juste remis la boucle dans laquelle ca plante, les définitions sont sur la page précédente (en bas de la page)

    Sinon pour nb_send
    Ben voilà. T'as compris la différence ?

    La valeur retournée par send() est d'abord un entier signé (officiellement, selon POSIX.1, qui est une norme ISO, un ssize_t, mais non standard C, ou peut être C99...).

    Ca permet de savoir si il y a erreur ou non.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       ssize_t err = send(...);
       if (err != SOCKET_ERROR)
       {
    Après le test, et seulement après, on peut considérer la valeur comme non signée. Pas avant, sinon, on ne voit jamais le -1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          size_t n = (size_t) err;
    J'ai donné précédemment une version un peu moins paranoïaque et probablement plus portable...
    Pas de Wi-Fi à la maison : CPL

  5. #25
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    size_t est un type non-signé, et ne sert à rien puisque send() retourne un int.
    Officiellement (POSIX.1), un ssize_t...
    Pas de Wi-Fi à la maison : CPL

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Je viens de passer mon size_t en ssize_t et j'ai plus de souci avec GCC (avec les options -Wall -Wextra -O2 donc c'est déja une chose de gagné, je vous en remercie

    Voici donc ma fonction telle qu'elle est a l'instant t (avec les modifs apportées depuis le début du post)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Edit: Voir post ci-aprés
    Mon code me semble suivre les conseils que vous m'avez donné, pourtant j'ai toujours le même problème, j'ai donc surement ratté quelque chose, mais je vois pas quoi.

  7. #27
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Creuvard
    Mon code me semble suivre les conseils que vous m'avez donné, pourtant j'ai toujours le même problème, j'ai donc surement ratté quelque chose, mais je vois pas quoi.
    Malgré mon insistance, il y a toujours un 'return (NULL);' inadéquate que ton compilateur devrait signaler...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `envoie_de_fichier':
    main.c:18: warning: `return' with a value, in function returning void
    Si il ne le fait pas, c'est qu'il est mal réglé :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    Je déconseille de combiner affectation et test dans un if. Ca alourdit inutilement.
    Pas de Wi-Fi à la maison : CPL

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Malgré mon insistance, il y a toujours un 'return (NULL);' inadéquate que ton compilateur devrait signaler...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    main.c: In function `envoie_de_fichier':
    main.c:18: warning: `return' with a value, in function returning void
    Arf c'est une erreur de copier-coller de ma part. désolé.

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #define BUFSIZE 512
    #define SOCKET_ERROR -1 
    void
    envoie_de_fichier(int socket,char *nom, int debut, int fin)
    {
            int reste;
            int nb_lu;
            ssize_t nb_send;
            char buffer[BUFSIZE];
            FILE *fichier_src;
            reste = fin - debut;
            fichier_src = fopen (nom, "rb");
            if ( fichier_src == NULL)
            {
                    perror("fopen() ");
                    return ;
            }
            fseek(fichier_src, debut, SEEK_SET);
            while ( reste > BUFSIZE)
            {
                 nb_lu = fread( buffer, 1, sizeof buffer, fichier_src);
                 if (nb_lu >= 0 )
                 { 
                      nb_send = send(socket, buffer, nb_lu, 0);
                      if( (nb_send != SOCKET_ERROR)
                             reste = reste - nb_lu;
                      else
                      {
                             perror("send() ");
                             fclose(fichier_src);
                             return ;
                     }
                  }
                  else
                  {
                         perror("fread()");
                   }
            }
            nb_lu = fread( buffer, sizeof(char), reste, fichier_src);
            nb_send = send(socket, buffer, nb_lu, 0);
            if(nb_send == SOCKET_ERROR)
            {
                    perror("write() ");
                    fclose(fichier_src);
                    return ;
            }
            fclose(fichier_src);
    }

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Salut à tous.

    Voila je viens de remettre le nez dans ma fonction.
    Il semblerait que (selon moi, donc cela n'est point sur dutout) que le problème vienne du signal SIGPIPE renvoyé par la fonction "socket()"

    Citation Envoyé par man socket(2)
    Un signal SIGPIPE est envoyé au processus tentant d'écrire sur une socket inutilisable, forçant les programmes ne gérant pas ce signal à se terminer.
    J'ai trouvé un "man setsockopt()" dans lequel on peut passer à cette fonction la fonction " SO_NOSIGPIPE "
    Citation Envoyé par man setsockopt(2)
    SO_NOSIGPIPE is an option that prevents SIGPIPE from being raised when a
    write fails on a socket to which there is no reader; instead the write to
    the socket returns with the error EPIPE when there is no reader.
    Sauf que avec cette option j'ai une erreur de compilation.
    Citation Envoyé par create_tcp_server()
    int
    create_tcp_server (int port, int nb_max_clients)
    {
    ...
    ..
    int socket_id;
    int optval=1;
    setsockopt(socket_id, SOL_SOCKET, SO_NOSIGPIPE,(char *)&optval, sizeof (optval));
    ...
    ..
    .
    return(socket_id);
    }
    Le message du compilateur
    Citation Envoyé par gcc
    create_tcp_server.c: In function ‘create_tcp_server’:
    create_tcp_server.c:34: erreur: ‘SO_NOSIGPIPE’ undeclared (first use in this function)
    create_tcp_server.c:34: erreur: (Each undeclared identifier is reported only once
    create_tcp_server.c:34: erreur: for each function it appears in.)
    J'ai oublié quelque chose ? Ou il faut que je cherche ailleurs ?

  10. #30
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    A tout hasard dans quel header se trouve SO_NOSIGPIPE ?
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par hegros
    A tout hasard dans quel header se trouve SO_NOSIGPIPE ?
    A priori dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <sys/types.h>
    #include <sys/socket.h>
    cf ce lien => http://www.hmug.org/man/2/setsockopt.php

    Ils sont bien dans la fonction qui crée le socket.

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Points : 20
    Points
    20
    Par défaut
    Je m'y suis remis ce matin et j'i finalement trouvé deux solutions.

    Rajouter le flag MSG_NOSIGNAL à la fonction "send()"

    Et puis l'utilisation de la commande "signal(SIPIPE, SIG_IGN)"

    La seconde méthode est peut être une méthode moin correcte (Bien que j'en sache rien) mais elle a le mérite de marcher sur les déconnexions impromptue des client sur les connexions via la lib OpenSSL (SSL_write)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Connexion client/serveur en réseau v11gR2
    Par cobra85 dans le forum Oracle
    Réponses: 7
    Dernier message: 11/01/2011, 14h51
  2. connexion client serveur en j2me
    Par unidach dans le forum Java ME
    Réponses: 2
    Dernier message: 29/06/2007, 18h56
  3. Réponses: 8
    Dernier message: 12/07/2006, 17h37
  4. [SOCKET] connexion client serveur avec applet
    Par kaiser2003 dans le forum Applets
    Réponses: 2
    Dernier message: 06/10/2004, 22h32
  5. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 16h58

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