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

C Discussion :

fonction read. avec socket


Sujet :

C

  1. #1
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut fonction read. avec socket
    bonjour,
    en m'amusant un peu dans un programme je me suis rendu compte du pourquoi dans un precedent topic ma function read bloquait.
    voici le code appellant read:
    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
     connfd=accept(listenfd,(struct sockaddr*) &client,&len);
        for(;;)
        {
     
            ip=inet_ntoa(client.sin_addr);
            n_cport=ntohs(client.sin_port);
            fprintf(stdout,"connection from %s,port %d\n",ip,n_cport);
     
            //int s_s=fd_readln(connfd,buff,BUFF_SIZE);
            int s_s=fd_read(connfd,buff,BUFF_SIZE);
            fprintf(stdout,"[%d] %s",s_s,buff);
     
            if(s_s==4 && buff[0]=='\\' && buff[1]=='q')
            {
                sprintf(buff,"connected with %s and port %d\n",ip,n_cport);
                fd_write(connfd,buff,strlen(buff));
                close(connfd);
                break;
            }
            fd_write(connfd,"OK \n",4);
     
        }
        close(listenfd);
    quand je fait un telnet sur localhost je ne recois jamais ok. et printf qui doit m'afficher la tail recu et le text n'affiche jamais rien.
    j'ai envoye un text de dimension BUFF_SIZE par telnet et la j'ai recu la taille et le text
    donc la fonction fd_read attend de recevoir un texte de dimension BUFF_SIZE avant de sortir. ce qui est tres embetant car je veux sortir si je recois "\q" c'est pour cela qu'il y a la deuxieme fonction fd_readln qui sort si j'ai atteind BUFF_SIZE ou si un '\n'

    j'aimerai savoir si il y a un moyende lire la socket au rythme au quel je tape avec telnet et non pas attendre d'avoir remplis le buffer.

    voici le code de fd_read a toute fin utiles:
    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
    size_t fd_read(int fd, void *buff, size_t nbyte)
    {
        size_t nleft;
        size_t nread;
        char *ptr;
     
        ptr=buff;
        nleft=nbyte;
        while(nleft>0)
        {
            if((nread=read(fd, ptr, nleft))<0)
            {
                if(errno==EINTR)
                    nread=0;
                else
                    return -1;
            }
            else if(nread==0)
                break;              /*EOF*/
     
            nleft -= nread;
            ptr += nread;
        }
        return (nbyte - nleft);
    }
    en regardant le code je comprend toujours pas pourquoi ca bloque. Merci pour coup de main.

  2. #2
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Tu peux toujours lire caractère par caractère ou alors lire avec un timeout.

  3. #3
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    oui, enfaite j'ai fait une autre fonction fd_read_tochar() qui lit caractere par caractere jusqu'a la premiere occurrence d'un caractere ce qui fait que je peux envoyer par exemple
    4563948$???????????-----???? ou les ? sont des octets
    et faire fd_read_tochar(fd,'$',MAXLINE); ce qui signifie que apres le '$' j'ai 4563948 octets donc je peux faire un malloc et appeller la fonction fd_read()

    il y a deux probleme avec cette solution:
    1- j'oblige les autres applications a ecrire la taille des donnees
    2- si la taille n'est pas pressise et que je lis char par char ca va me couter chere en performence si les donnees sont importante.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ceci s'appelle un protocole (plus précisément un format de fichier), c'est une définition qui est sensé être respectée.
    Quand ce n'est pas le cas, il y a au minimum un rejet par l'application, voire un crash.

  5. #5
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    ca c'est cas.
    imaginons que j'utilise la meme fonction pour recevoir des donnees cote client.
    disons.... http.
    donc je fait un write pour envoyer une requette GET puis je suis en fd_read pour lire la page renvoyer par le serveur. supposons que je sois sure que lapage renvoyer soit < 8192 donc je mets mon BUFF_SIZE a 8192 pour recevoir ma page web.
    de plus dans ma requete je demande de ne pas fermer la connection apres l'envois de la page car j'ai une autre requete que j'aimerai faire imediatement.
    probleme la vage renvoyer vaux 5690 donc je reste coince jusqu'a ce que le serveur de deconnect pour time out.
    c'est pas marrant. il doit bien y avoir un moyen de lire jusqu'a ce qu'il n'y ai plus rien a lire au lieu d'attendre EOF pour quitter la boucle non?

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Mais justement, c'est EOF qui indique qu'il n'y a plus rien à lire.
    Enfin, si le monde n'a pas changé depuis l'autre jour.

  7. #7
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    je sais pas si vous avez bien suivi ce que j'ai dit:

    A est le serveur il ecoute
    B est le clien par exemple telnet

    B envois bonjour a A
    A recois "bonjour" mais la fonction read reste bloque car attend d'avoir recut BUFF_SIZE byte ou EOF qui ne viendra que quand telnet aura ferme la connection

    en d'autre termes si telnet attandait un reponse imediate il va attendre une eternite car A attend de recevoir BUFF_SIZE ou que telnet se debouille pour faire comprendre a A que c'est EOF juste apres la touche entree.

  8. #8
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    Salut,

    C'est bizarre ton truc!
    Tu est en TCP (SOCKET_STREAM)?

    Je ne suis pas un expert des sockets, mais normalement la fonction read devrai lire au maximum BUFF_SIZE caractères et non au minimum BUFF_SIZE caractères, d’ailleurs ce n'est pas plutôt les fonctions recv ou recvfrom qu'il faudrait utiliser?

  9. #9
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Je pensais aussi que c'etait maximum et non minimum.
    mais visiblement read bloque tant que je n'ai pas atteint la taille ou que je n'ai pas recu EOF

    en ce qui concerne recv evitons d'en parler ca va attirer des trolls il ya deja un topic la dessus. sinon j'utilise read pour 2 raisons, c'est posix, je suis sur un systeme posix et la fonction s'appelle fd_read fd pour file descriptor et non sock_read. donc cette fonction est generale et pas specifique aux sockets.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/01/2013, 18h17
  2. Fonction Read avec un nombre de variables variables
    Par defunes43 dans le forum Fortran
    Réponses: 3
    Dernier message: 09/12/2011, 20h39
  3. Réponses: 6
    Dernier message: 24/10/2008, 16h28
  4. Problème avec la fonction read.
    Par Whaouu dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2005, 10h33
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

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