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

POSIX C Discussion :

problème d'affichage dans un thread


Sujet :

POSIX C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Par défaut problème d'affichage dans un thread
    Bonjour,

    j'ai un petit souci au niveau de l'affichage dans un thread. Dans ce thread je lis des caracteres d'une socket je les écris dans un fichier. Et lorsque il ny a plus rien à lire, celà devrait afficher "FICHIER RECU". Pourtant rien ne s'affiche alors qu'il n'y a plus rien à lire. Voici 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
     
    void * lectureFichier( int s)
    {
     
     
    		int dfichier ;
     
    		printf("RECEPTION DU FICHIER\n") ;
    		if((dfichier = open("fichierRecu", O_WRONLY| O_CREAT, 0666))<0)
    		{
    			perror("erreur open") ;
    			exit(-9) ;
    		}
    		else
    		{
    			char * buf = malloc(512*sizeof(char))   ;
    			int lu ;
    			while((lu=read(s,buf,512))>0)
    			{	
    				write(dfichier,buf,512) ;
     
    			}
    			//write(1,"FICHIER RECU\n", strlen("FICHIER RECU\n")) ;	
    			printf("FICHIER RECU\n") ;
    			close(dfichier) ;
     
    		}
     
     
    		pthread_exit(NULL) ;
     
    }
    Si vous pouviez m'éclairer

  2. #2
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Il faut tout le code (l'appelant également).

    Par ailleurs,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void * lectureFichier( int s)
    ne me parait être le prototype d'appel POSIX d'un pthread. J'avais en tête que le paramètre doit être void*. Je n'en suis pas sur.

  3. #3
    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 innosang
    j'ai un petit souci au niveau de l'affichage dans un thread. Dans ce thread je lis des caracteres d'une socket je les écris dans un fichier. Et lorsque il ny a plus rien à lire, celà devrait afficher "FICHIER RECU". Pourtant rien ne s'affiche alors qu'il n'y a plus rien à lire.
    C'est normal. La réception est bloquante, donc si il n'y a rien à lire, recv() suspend le thread.

    Le transfert de fichier, ça ne se fait pas au hasard en ouvrant un tuyau et en jetant les octets dedans en vrac et surtout sans indication de taille ni de marque de fin. Il faut un protocole, même rudimentaire...

    Je propose que les 4 premiers octets transmis contiennent la taille du fichier à transmettre. (MSB en tête). Ensuite, le fichier est transmis en vrac.
    C'est le strict minimum.

    En réception, on extrait les 4 premiers octets, on arme un compteur de cette valeur, que l'on décrémente au fur et à mesure de la récéption. Quand on atteint 0, on ferme le fichier, on libère la mémoire alloué et on quitte le thread .

    Pour être sérieux, il faudrait plutôt (coté émetteur) :
    1. transmettre le taille et le nom du fichier
    2. attendre l'acquittement :
      • OK
      • Pas de place
      • Existant
      • etc.
    3. transmettre un bloc
    4. attendre l'acquittement
    5. répéter en 3 tant qu'il y a des blocs a transmettre

    Sinon, voir TFTP ou FTP, c'est fait pour...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Par défaut
    Le fichier est correctement receptionné ... c'est simplement que la sortie de boucle ne se fait pas ...

  5. #5
    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 innosang
    Le fichier est correctement receptionné ... c'est simplement que la sortie de boucle ne se fait pas ...
    Normal, tu n'as fourni aucun moyen de sortir de la boucle. Encore une fois, il faut tenir les comptes et quitter quand on a tout reçu. Quels sont les mots que tu n'a pas compris dans ma réponse précédente ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Par défaut
    je ne vois vraiment pas du tout pourquoi ça ne sortirait pas de la boucle car pour l'envoi du fichier j'effectue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while((lu=read(dfichier,buf,512))>0)
    {	
    	write(s2,buf,lu) ;
    	//write(1, buf, lu) ;
    }	
    printf("TRANSFERT TERMINE\n") ;
    close(dfichier) ;
    et le read étant bloquant il ne devrait pas sortir non plus de la boucle ....

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Par défaut
    j'ai codé la reception comme ci :
    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
     
    			char buf  ;
    			int lu ;
    			int taille ;
    			read(s,&taille,sizeof(taille)) ;
    			printf("%d\n", taille) ;
    			while(taille>0)
    			{	
    				read(s,&buf,1) ;
    				write(dfichier,&buf,1) ;
     
     
    				taille-- ;			
    			}
    			printf("FICHIER RECU\n") ;
    ça fonctionne ... mais je ne vois pas en quoi le read pour lire dans un fichier est différent du read pour lire dans une socket ...

  8. #8
    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 innosang
    je ne vois vraiment pas du tout pourquoi ça ne sortirait pas de la boucle car pour l'envoi du fichier j'effectue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while((lu=read(dfichier,buf,512))>0)
    {	
    	write(s2,buf,lu) ;
    	//write(1, buf, lu) ;
    }	
    printf("TRANSFERT TERMINE\n") ;
    close(dfichier) ;
    et le read étant bloquant il ne devrait pas sortir non plus de la boucle ....
    Dans le cas d'un fichier, le read() est prévenu de ce que la fin de fichier a été atteinte. C'est là toute la différence. Il retourne alors une valeur < à 0 et on sort de la boucle.

    Un recv() ça ne fonctionne pas pareil. Y'a rien qui lui dit que la fin de flux a été detectée, sauf si l'émetteur détruit la connexion, ce qui ne doit pas se faire, car on ne sait pas si les données ont été reçues.

    Donc il se bloque et le thread est suspendu ad vitam aeternam.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    189
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 189
    Par défaut
    daccord merci pour tes explications ... j'ai compris

    Bonne soirée

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/12/2011, 13h56
  2. Problème d'affichage dans un thread
    Par mouette999 dans le forum C#
    Réponses: 8
    Dernier message: 29/11/2011, 17h15
  3. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  4. Problème d'affichage dans un composant TScrollBox
    Par erossi dans le forum Composants VCL
    Réponses: 3
    Dernier message: 14/09/2005, 11h29
  5. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00

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