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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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