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 :

Select bloquand en ecriture


Sujet :

Réseau C

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 37
    Points
    37
    Par défaut Select bloquand en ecriture
    Bonjour,
    Je travaille sur un projet reseau ou le server ne doit pas bloquer meme s'il envois des donnees a un client qui enfin de compte ne les lis jamais. (C'est un peu idiot mains bon c'est le sujet).
    J'utilise select(2) pour monitorer des sockets en lecture et en ecriture. Pour la lecture pas de probleme ca marche impec. Pour l'ecriture, si le client ne lie pas les donnees qu'on lui envois, select me dis que je peu ecrire dessus alors que ca bloque.
    Comment bien utilser select pour l'ecriture sur une socket ?
    Je travaille sous NetBSD.

  2. #2
    Membre habitué
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2006
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Mai 2006
    Messages : 75
    Points : 160
    Points
    160
    Par défaut
    tu pourrais montrer ton code pour qu'on trouve le problème.

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 37
    Points
    37
    Par défaut Voila le code
    J'avais oublier le plus important le 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
    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
     
    int     boucle(int s, struct sockaddr_in *client_sin, int *client_sin_len, t_param *params)
    {
      struct timeval        tv;
      int                   cs;
      int                   fd_max;
      t_client              *begin_cl;
      fd_set                readf;
      fd_set                writef;
     
    typedef struct  s_message
    {
      char                  *message;
      struct  s_message     *next;
    }               t_message;
     
    typedef struct  s_client
    {
      int                   fd;
      t_message             *snd_msg;
      struct s_client       *next;
    }               t_client;
     
      tv.tv_sec = 1;
      tv.tv_usec = 0;
      begin_cl = NULL;
      while (1)
        {
          fd_max = ini_fd_set(&readf, begin_cl, s);
          fd_max = ini_fd_set_out(&writef, begin_cl, fd_max);
          if (select(fd_max + 1, &readf, &writef, NULL, &tv) < 0)
            {
              perror(PROJ_NAME);
              my_putstr("close\n");
              fd_max = ini_fd_set(&readf, begin_cl, s);
              fd_max = ini_fd_set_out(&writef, begin_cl, fd_max);
            }
          else if (FD_ISSET(s, &readf))
            {
              cs = accept(s, (struct sockaddr *)client_sin, client_sin_len);
              my_putstr("accept\n");
     
              begin_cl = ajoute_liste(cs, begin_cl);
            }
          my_putstr("select\n");
          begin_cl = parse_fd_set(&readf, begin_cl);
          parse_fd_set_out(&writef, begin_cl);
        }
    }
    Code de ini_fd_set_out

    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
     
    int     ini_fd_set_out(fd_set *writef, t_client *cl, int s)
    {
      int           fd_max;
      t_client      *crt;
     
      fd_max = s;
      crt = cl;
      while (crt)
        {
          if (crt->snd_msg)
            {
              FD_SET(crt->fd, writef);
              if (crt->fd > fd_max)
                fd_max = crt->fd;
            }
          crt = crt->next;
        }
      return (fd_max);
    }
    Code de parse_fd_set_out
    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
     
    void    parse_fd_set_out(fd_set *writef, t_client *cl)
    {
      t_client      *cl2;
     
      cl2 = cl;
      while (cl)
        {
          if (cl->snd_msg)
            {
              if (FD_ISSET(cl->fd, writef))
                {
                  my_putstr("envvoi\n");
                  if (send_msg(cl->snd_msg->message, cl->fd) > 0)
                    {
                      free_snd_msg(cl);
                    }
                }
            }
          cl = cl->next;
        }
    }
    Je les infs de chaque client dans une liste chainer (t_client).

    t_message est une liste chainer des messages que je veux envoyer.

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Points : 37
    Points
    37
    Par défaut Ca bloque toujours, utilise-je bien le FD_ISSET ?
    En mettant MSG_WAITALL ou MSG_DONTWAIT ca ne bloque pas des le premier envois mais aubout d'un certain nombre d'envois ca bloque quand meme.
    Enfait ce que je ne comprends pas c'est que meme en passant par un select et donc par FD_ISSET, l'envoi de message bloque toujours.
    Si quelcun a un idee sur la chose car la je seche.

    Normalemet quand je fait un FD_ISSET(fd_set, socket), si je n'ai pas 0 c'est que je peus ecrire sur le socket en question. Dit - moi si je me trompe.

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par caesarvanou
    [...]
    Pour l'ecriture, si le client ne lie pas les donnees qu'on lui envois, select me dis que je peu ecrire dessus alors que ca bloque.
    [...].
    Pour un dialogue de ce type (enfin si le client n'ecoute pas, ce n'est pas vraiment un dialogue), il serait préférable d'utiliser le mode UDP (à confirmer par un spécialiste réseau s'il y en a un ici).
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

Discussions similaires

  1. [XL-2003] Probleme bidon de selection et d'ecriture dans cellule
    Par sharox dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 31/01/2014, 03h18
  2. Ecriture en gras pour les options d'un select
    Par benhsaien dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 19/09/2011, 07h46
  3. selection de langue d'ecriture dans JTextField
    Par bravvve dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 13/03/2011, 10h16
  4. Ecriture vers Excel selection ?
    Par samtheh dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/11/2007, 10h13
  5. Select avec écriture non bloquante
    Par Invité dans le forum Réseau
    Réponses: 5
    Dernier message: 24/05/2006, 16h20

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