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 :

socket nonblock


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 5
    Par défaut socket nonblock
    Bonjour à tous,

    Je dois recupérer des infos d'une socket serveur que je ne peux modifier.
    Je sais lire cette socket par un "read", elle est de type "(AF_UNIX,SOCK_STREAM)" sur un device. Jusque la, aucun soucis.
    Le problème que je ne parviens pas à résoudre est que je ne souhaiterais pas que mon "read" soit bloquant. J'ai beau essayer avec les commandes du genre :

    ioctl(srv_socket,FIONBIO,&argp);
    ou
    fcntl(srv_socket, F_SETFL, fcntl(srv_socket, F_GETFL, 0) | O_NONBLOCK);

    Le read ne block plus mais il ne lit plus rien non plus.
    Comment puis-je récupérer les infos en mettant mon "read" à "nonblock" ?
    Merci.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: socket nonblock
    Citation Envoyé par tl44
    Je dois recupérer des infos d'une socket serveur que je ne peux modifier.
    [Rien à voir avec le langage C.]

    Toujours pareil. Ne rien bidouiller et utiliser select() ou poll() avant read().

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 5
    Par défaut
    Ok pour le socket, je pensais qu'il servait uniquement dans le cas de plusieurs socket.

    Malgré tout ça, le select attent dans mon cas 5 sec mais il ne voit rien.
    Mon code pour que ce soit plus claire :

    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
    int connexion()
    {
    struct sockaddr_un addr;
    int retour,srv_socket;
    u_long argp=0;
    int len,result,m=0;
     
      fd_set rfds;
      struct timeval tv;
       int retval;
      tv.tv_sec=5;
      tv.tv_usec=0;
      FD_ZERO(&rfds);
      FD_SET(srv_socket,&rfds);    //La je suis pas sure
     
         addr.sun_family = AF_UNIX;
         strcpy(addr.sun_path,"/dev/mondevice");
     
        srv_socket=socket(AF_UNIX,SOCK_STREAM,0);
       if (srv_socket == ERREUR)
        {
          perror("accept");
          exit(0);
        }
       result=connect(srv_socket,(struct sockaddr *)&addr,sizeof(addr));
      if(result == -1)
        {
          perror("connect");
          printf("Serveur indisponnible. Nouvelle tentative dans 1 min\n");
          exit(0);
          }
         retval = select(1, &rfds, NULL, NULL, &tv);  //Pas certain du premier argument du select
               if (retval == -1)
                perror("select()");
               else if (retval)
    	     {
                read(srv_socket,buffer,sizeof(buffer));
                printf("Data is available now.\n");
     	     }
               else
                 printf("No data within five seconds.\n");
    }

    Merci

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut

    Citation Envoyé par tl44
    Malgré tout ça, le select attent dans mon cas 5 sec mais il ne voit rien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         retval = select(1, &rfds, NULL, NULL, &tv);  //Pas certain du premier argument du select
    Effectivement. Il y a en principe une macro dédiée qui calcule cette valeur. Relire le manuel ou chercher deds exemples sur le net. (On est hors-sujet...)

    Les gens du forum "Développement Linux" savent ça par coeur...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    ben tu as mis le FD_SET(srv_socket) avant le srv_socket = socket()...
    Bref, le select() attend sur un n° de socket invalide...
    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.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juillet 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 5
    Par défaut
    Effectivement, il y avait plusieurs erreurs. Je m'en suis sortie. Pour ceux que ça interesse, ce code fonctionne pour lire sur une socket sans figer le prog.

    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
     
         addr.sun_family = AF_UNIX;
         strcpy(addr.sun_path,"/dev/mondevice");
         srv_socket=socket(AF_UNIX,SOCK_STREAM,0);
         if (srv_socket == ERREUR)
          {
            perror("accept");
            exit(0);
          }
          result=connect(srv_socket,(struct sockaddr *)&addr,sizeof(addr));
         if(result == -1)
           {
             perror("connect");
             printf("Serveur indisponnible. Nouvelle tentative dans 1 min\n");
           }
          tv.tv_sec=2;
          tv.tv_usec=0;
          FD_ZERO(&rfds);
          FD_SET(srv_socket,&rfds);
          retval = select(srv_socket+1, &rfds, NULL, NULL,&tv);
               if (retval == -1)
          {
                perror("select()");
                return(1);
           }
        if (retval)
         {
          read(srv_socket,buffer,sizeof(buffer));
                }
    Encore merci à tous pour votre aide et votre rapidité.

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

Discussions similaires

  1. executer une application a distance : Sockets ? RPC ? CORBA?
    Par a_hic dans le forum Développement
    Réponses: 5
    Dernier message: 30/05/2006, 13h02
  2. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  3. socket
    Par ben91 dans le forum Développement
    Réponses: 5
    Dernier message: 13/08/2002, 11h04
  4. Socket:Envoyer du texte d'un serveur vers tout les clients
    Par cedm78 dans le forum Web & réseau
    Réponses: 7
    Dernier message: 01/08/2002, 16h40
  5. transfert d'un fichier bitmap en socket tcp
    Par localhost dans le forum C++Builder
    Réponses: 5
    Dernier message: 29/07/2002, 00h40

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