[C/UNIX] lire un stream ouvert a partir d'un file descriptor de socket

lire un stream ouvert a partir d'un file descriptor de socket [C/UNIX] - Programmation

Marsh Posté le 06-02-2002 à 00:43:48    

petit resume de la situation :    
   
j'ai ma connection tcp entre mon serveur et mon client associee a un file descriptor    
je peux sans probleme lire et ecrire dans ce file descriptor    
   
or, j'ai besoin d'un stream (FILE *) pour pouvoir parser avec lex/yacc ce que le client envoie a mon serveur    
   
je "transforme" le file descriptor en stream grace a la fonction fdopen    
   
j'arrive a ecrire dans ce stream pour envoyer des infos (je le fais juste pour tester que le stream fonctionne car mon but principal est de recevoir des infos et non d'en envoyer, du moins pour l'instant)    
   
je viens de decouvrir que je recevais bien les donnees du client dans le serveur via le stream mais qu'elles n'arrivaient que quand la connection tcp se coupait    
   
en gros, j'etablie la connection client/serveur, j'envoie des donnees du client vers le serveur mais je ne "recois" rien au niveau du serveur<    
je coupe la connection au niveau du client, et la, comme par magie les infos arrivent au serveur    
   
il s'agit donc clairement d'un probleme de bufferisation des donnees dans le stream    
   
le probleme, c'est que les fonctions de la famille setvbuf (qui servent a regler le mode de bufferisation d'un stream) n'ont aucun effet sur mon stream  
 
PS: si vous savez comment utiliser lex/yacc avec autre chose qu'un stream (genre un file descriptor), je suis aussi preneur

 

[jfdsdjhfuetppo]--Message édité par titoine42--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 06-02-2002 à 00:43:48   

Reply

Marsh Posté le 06-02-2002 à 00:52:18    

je viens de lire en entier le man de fdopen et j'ai trouvé ça:
 
The fdopen() function associates a stream with the existing file descriptor, fildes.  The mode of the stream must be compatible with the mode of the file descriptor.  The stream is positioned at the file offset of the file descriptor.
 
sachant que mon fd est en read/write et que je lui demande seulement du read ça devrait fonctionner?

Reply

Marsh Posté le 06-02-2002 à 02:14:45    

moi j'utilise pas fdopen pour mon client irc ... mais les fonctions bien standard genre read :
 
char data_arrive[1024];
read(sock_actif,data_arrive,200);
 
pis apres, y a pu k'a !

Reply

Marsh Posté le 06-02-2002 à 09:43:12    

je n'ai pas vraiment, le choix sachant que j'utilise lexyacc, il me faut un FILE *

Reply

Marsh Posté le 06-02-2002 à 10:40:34    

titoine42 a écrit a écrit :

je viens de lire en entier le man de fdopen et j'ai trouvé ça:
 
The fdopen() function associates a stream with the existing file descriptor, fildes.  The mode of the stream must be compatible with the mode of the file descriptor.  The stream is positioned at the file offset of the file descriptor.
 
sachant que mon fd est en read/write et que je lui demande seulement du read ça devrait fonctionner?  




 
Ca veut dire que le file descriptor que tu passe en argument à fdopen() et le mode d'ouverture de fdopen() doivent être les même.
 
si tu mets ton fdopen() en r et que ton fd de base est en r/w, je pense que ca doit déconner.


---------------
"Si ça peut déconner, ça va déconner..."
Reply

Marsh Posté le 06-02-2002 à 10:42:07    

j'ai essayer de mettre exactement le meme mode d'ouverture mais ça ne change rien
 
je suis en discussion avec un prof pour trouver où ça peux merder

Reply

Marsh Posté le 06-02-2002 à 17:12:19    

un prof m'a dit que le problème venait du fait que c'est bufferisé
 
j'ai donc utilisé la fonction setvbuf pour mettre en buffer ligne à ligne mais sans succes.
 
j'ai aussi essayé en passant le stream en mode non bufferisé mais ça ne change rien  :cry:

Reply

Marsh Posté le 06-02-2002 à 20:35:59    

tu peux faire un perror() dérrière le fdopen, qu'on voit ce qu'il se passe ?
 
d'aillieurs si le fdopen échoue, y retourne pas NULL ?

Reply

Marsh Posté le 06-02-2002 à 21:02:07    

bonne idée, j'ai pas testé la valeur de retour du fdopen

Reply

Marsh Posté le 06-02-2002 à 22:42:50    

le fdopen me renvoie un pointeur non-NULL donc il fonctionne  
 
si j'ouvre en read/write et que je fais un fprintf sur le stream, les donnees sont bien transmises de l'autre cote  :heink:  
 
le probleme, c'est que ce qui m'interresse, c'est lire le stream et pas ecrire dedans

Reply

Marsh Posté le 06-02-2002 à 22:42:50   

Reply

Marsh Posté le 06-02-2002 à 23:48:45    

si tu fais un fread() dans un tampon, et que tu puts() ce tampon, y'a bien quelque chose ?
 
c'est pas le fscanf qui échoue ? (n'oublies pas que la famille de scanf() retournent le nombre d'éléments convertis...)

Reply

Marsh Posté le 07-02-2002 à 01:18:05    

petit resume de la situation :  
   
 j'ai ma connection tcp entre mon serveur et mon client associee a un file descriptor  
 je peux sans probleme lire et ecrire dans ce file descriptor  
   
 or, j'ai besoin d'un stream (FILE *) pour pouvoir parser avec lex/yacc ce que le client envoie a mon serveur  
   
 je "transforme" le file descriptor en stream grace a la fonction fdopen  
   
 j'arrive a ecrire dans ce stream pour envoyer des infos (je le fais juste pour tester que le stream fonctionne car mon but principal est de recevoir des infos et non d'en envoyer, du moins pour l'instant)  
   
 je viens de decouvrir que je recevais bien les donnees du client dans le serveur via le stream mais qu'elles n'arrivaient que quand la connection tcp se coupait  
   
en gros, j'etablie la connection client/serveur, j'envoie des donnees du client vers le serveur mais je ne "recois" rien au niveau du serveur<  
je coupe la connection au niveau du client, et la, comme par magie les infos arrivent au serveur  
   
il s'agit donc clairement d'un probleme de bufferisation des donnees dans le stream  
   
le probleme, c'est que les fonctions de la famille setvbuf (qui servent a regler le mode de bufferisation d'un stream) n'ont aucun effet sur mon stream
 
PS: si vous savez comment utiliser lex/yacc avec autre chose qu'un stream (genre un file descriptor), je suis aussi preneur

 

[jfdsdjhfuetppo]--Message édité par titoine42--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 07-02-2002 à 12:21:22    

:bounce:

Reply

Marsh Posté le 07-02-2002 à 23:38:15    

:hot:

Reply

Marsh Posté le 08-02-2002 à 00:08:39    

un fflush() ptet ?

Reply

Marsh Posté le 08-02-2002 à 00:11:42    

déjà essayé le flush  :sarcastic:

Reply

Marsh Posté le 08-02-2002 à 01:32:26    

bjone a écrit a écrit :

un fflush() ptet ?  




 
pour une fois ke je pense pouvoir repondre a une kestion prog, il a fallut ke kkun dise ce ke je voulais dire avant moi :fou:
 
c pô juste, rho pis je repond kan meme !  :na:  
 
essai fflush(descripeur);


---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
Reply

Marsh Posté le 08-02-2002 à 01:36:06    

de toute façon, même si le fflush fonctionnait, il me serait impossible de l'utiliser sachant que je ne contrôle pas la lecture au niveau de lex

Reply

Marsh Posté le 08-02-2002 à 01:39:32    

ha heu... bah, modifie le fichier c generer par lex  :sarcastic:  
 
pour tester... tu verra si ca marche comme ca au moins


---------------
Signatures aux choix Votez:  O - Le python c'est bon, mangez-en  O - L'abus de forum rend dependant, postez avec modération
Reply

Marsh Posté le 08-02-2002 à 01:42:33    

Phod a écrit a écrit :

ha heu... bah, modifie le fichier c generer par lex  :sarcastic:  
 
pour tester... tu verra si ca marche comme ca au moins  




 
j'aimerais éviter ce genre de solutions
 
en plus, si tu voyais le code généré par flex

 

[jfdsdjhfuetppo]--Message édité par titoine42--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 08-02-2002 à 12:55:48    

:cry:

Reply

Marsh Posté le 08-02-2002 à 13:58:56    

un 0 de fin de chaine peut-etre ? un EOF ?


---------------
Aménager un camping car poids lourd dans un bus / car / camion  - Boinc pour faire bosser votre pc
Reply

Marsh Posté le 08-02-2002 à 14:47:06    

MarcP a écrit a écrit :

un 0 de fin de chaine peut-etre ? un EOF ?  




 
 :??:  explique un peu parce que je ne comprends pas vraiment ta suggestion

Reply

Marsh Posté le 08-02-2002 à 18:04:16    

note que j'avais modifier lex/yacc pour qu'il ne lise plus a partir d'un FILE * mais d'un truc a moi
 
 
Ca marchait, mais le faire , quelle galere !

Reply

Marsh Posté le 08-02-2002 à 22:27:29    

chrisbk a écrit a écrit :

note que j'avais modifier lex/yacc pour qu'il ne lise plus a partir d'un FILE * mais d'un truc a moi  
 
 
Ca marchait, mais le faire , quelle galere !  




 
c'est ce que je suis en train de faire : je recode la macro YY_INPUT

Reply

Marsh Posté le 08-02-2002 à 23:42:47    

:bounce: G REUSSI :bounce:  
 
J'ai recode la macro de lecture d'entree de lex avec des getc au lieu de fread et ca roule  :sol:

Reply

Marsh Posté le 09-02-2002 à 01:26:08    

titoine42 a écrit a écrit :

 
 
c'est ce que je suis en train de faire : je recode la macro YY_INPUT  




 
mumuse toi bien.... :D
 
(je ne le referais JAMAIS tellement c t horrible . Ca pis modifier les input de la ZLib . Grand dieux, quel code de cochon ! )

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed