Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1341 connectés 

  FORUM HardWare.fr
  Programmation

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°97140
Titoine42
Posté le 06-02-2002 à 00:43:48  profilanswer
 

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]

mood
Publicité
Posté le 06-02-2002 à 00:43:48  profilanswer
 

n°97141
Titoine42
Posté le 06-02-2002 à 00:52:18  profilanswer
 

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?

n°97146
karlkox
Posté le 06-02-2002 à 02:14:45  profilanswer
 

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 !

n°97163
Titoine42
Posté le 06-02-2002 à 09:43:12  profilanswer
 

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

n°97187
deepcore
Posté le 06-02-2002 à 10:40:34  profilanswer
 

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..."
n°97188
Titoine42
Posté le 06-02-2002 à 10:42:07  profilanswer
 

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

n°97464
Titoine42
Posté le 06-02-2002 à 17:12:19  profilanswer
 

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:

n°97574
bjone
Insert booze to continue
Posté le 06-02-2002 à 20:35:59  profilanswer
 

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 ?

n°97582
Titoine42
Posté le 06-02-2002 à 21:02:07  profilanswer
 

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

n°97605
Titoine42
Posté le 06-02-2002 à 22:42:50  profilanswer
 

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

mood
Publicité
Posté le 06-02-2002 à 22:42:50  profilanswer
 

n°97618
bjone
Insert booze to continue
Posté le 06-02-2002 à 23:48:45  profilanswer
 

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...)

n°97632
Titoine42
Posté le 07-02-2002 à 01:18:05  profilanswer
 

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]

n°97720
Titoine42
Posté le 07-02-2002 à 12:21:22  profilanswer
 

:bounce:

n°98029
Titoine42
Posté le 07-02-2002 à 23:38:15  profilanswer
 

:hot:

n°98046
bjone
Insert booze to continue
Posté le 08-02-2002 à 00:08:39  profilanswer
 

un fflush() ptet ?

n°98048
Titoine42
Posté le 08-02-2002 à 00:11:42  profilanswer
 

déjà essayé le flush  :sarcastic:

n°98055
Phod
Glouloulou ?
Posté le 08-02-2002 à 01:32:26  profilanswer
 

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
n°98056
Titoine42
Posté le 08-02-2002 à 01:36:06  profilanswer
 

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

n°98057
Phod
Glouloulou ?
Posté le 08-02-2002 à 01:39:32  profilanswer
 

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
n°98059
Titoine42
Posté le 08-02-2002 à 01:42:33  profilanswer
 

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]

n°98152
Titoine42
Posté le 08-02-2002 à 12:55:48  profilanswer
 

:cry:

n°98169
MarcP
Boinc.fr
Posté le 08-02-2002 à 13:58:56  profilanswer
 

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
n°98195
Titoine42
Posté le 08-02-2002 à 14:47:06  profilanswer
 

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

n°98270
chrisbk
-
Posté le 08-02-2002 à 18:04:16  profilanswer
 

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 !

n°98335
Titoine42
Posté le 08-02-2002 à 22:27:29  profilanswer
 

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

n°98355
Titoine42
Posté le 08-02-2002 à 23:42:47  profilanswer
 

: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:

n°98366
chrisbk
-
Posté le 09-02-2002 à 01:26:08  profilanswer
 

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 ! )

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

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

 

Sujets relatifs
Identification a partir d'active directory pour un site web interne !!Comment lire une clé de la base de registre à partir d'une page asp?
[Perl] sous Unix - Structures[Kylix] Creation de socket.....
[C++] lire la ligne suivante dans un fichier avec fstreamLire de midis en c++ ss Dos
[C/unix] Librairie de video[C++] Comment savoir si un client et toujours connecté à un socket ?
[PHP]Cherche script pour upload des fichiers a partir d'un formulaire 
Plus de sujets relatifs à : [C/UNIX] lire un stream ouvert a partir d'un file descriptor de socket


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR