select et socket enrobé de sucre (fdopen mode lecture) -> probleme ???

select et socket enrobé de sucre (fdopen mode lecture) -> probleme ??? - C - Programmation

Marsh Posté le 03-12-2004 à 17:38:48    

Salut à tous  :hello:  
 
J'ai un petit problème avec l'utilisation de select. Je n'ai rien trouvé sur le net ni dans le man pour ce genre de chose.
 
En gros j'ai un processus maitre qui écoute sur deux sockets. Un sert à la communication vers un navigateur sur lequel j'affiche des données via envoie de réponse HTTP suivies de code HTML. L'autre est une socket pour communiquer avec un processus esclave. Jusque là rien de bien sorcier.
 
Seulement voilà, je fais un select bloquant au moment ou le maitre n'a plus rien à faire càd qu'il attend soit un clic sur un lien dans le navigateur (le maitre reçoit alors une requete HTTP sur la socket) soit un message du processus esclave. Une des deux ou meme les deux actions en meme temps (meme temps bon c relatif) peut débloquer le maitre qui agira en fonction de la socket et du message.
 
Seulement voilà, je crois que quoi que je fasse, dès que je clique sur le lien, ça marche ok ça passe dans le cas où c'est le navigateur qui appelle mais à chaque tour de boucle.
 
Alors je me demandais si ça se pouvait que le fait d'avoir ouvert une socket enrobée de sucre en mode lecture (par un fdopen sur la socket) avant la boucle infinie qui contient le select puisse faire en sorte que la socket se trouve tjrs dans l'état "j'ai qqch pour toi" ?
 
EDIT : super question importante --> est-ce que je peux faire un select sur une socket et puis utilisé le socket enrobé de sucre que j'ai ouvert dessus pour faire des fscanf plus facile que des recv ?
 
 :jap:


Message édité par Flitz le 03-12-2004 à 17:40:01
Reply

Marsh Posté le 03-12-2004 à 17:38:48   

Reply

Marsh Posté le 03-12-2004 à 19:57:09    

FLitz a écrit :

Salut à tous  :hello:  
 
J'ai un petit problème avec l'utilisation de select. Je n'ai rien trouvé sur le net ni dans le man pour ce genre de chose.
 
En gros j'ai un processus maitre qui écoute sur deux sockets. Un sert à la communication vers un navigateur sur lequel j'affiche des données via envoie de réponse HTTP suivies de code HTML. L'autre est une socket pour communiquer avec un processus esclave. Jusque là rien de bien sorcier.
 
Seulement voilà, je fais un select bloquant au moment ou le maitre n'a plus rien à faire càd qu'il attend soit un clic sur un lien dans le navigateur (le maitre reçoit alors une requete HTTP sur la socket) soit un message du processus esclave. Une des deux ou meme les deux actions en meme temps (meme temps bon c relatif) peut débloquer le maitre qui agira en fonction de la socket et du message.
 
Seulement voilà, je crois que quoi que je fasse, dès que je clique sur le lien, ça marche ok ça passe dans le cas où c'est le navigateur qui appelle mais à chaque tour de boucle.
 
Alors je me demandais si ça se pouvait que le fait d'avoir ouvert une socket enrobée de sucre en mode lecture (par un fdopen sur la socket) avant la boucle infinie qui contient le select puisse faire en sorte que la socket se trouve tjrs dans l'état "j'ai qqch pour toi" ?
 
EDIT : super question importante --> est-ce que je peux faire un select sur une socket et puis utilisé le socket enrobé de sucre que j'ai ouvert dessus pour faire des fscanf plus facile que des recv ?
 
 :jap:


C'est un poil compliqué ton truc...
1) ne pourrais-tu pas utiliser les pipes (man pipe) pour communiquer entre tes 2 processus plutôt qu'une socket ? Tu te ferais moins ch...
 
2) je ne crois pas que tu puisses utiliser du "fread" ou "fget" ou "fscan" sur une socket puisqu'une socket c'est pas du "FILE*". Tu peux juste faire du "read/write" plutôt que "send/recv" si tu en as envie. Maintenant, si ton pb c'est le formattage des données entrantes, ben t'as qu'à faire du "recv+sscanf"

Reply

Marsh Posté le 03-12-2004 à 20:20:38    

Salut,
 
beh en fait g schématisé un peu trop je pense. En fait j'ai un processus maitre, et N (au N vaut 30 quasi) processus esclaves. J'utilise en fait des socketpair avant de faire des fork ce qui au final me permet de faire des canaux de communication entre mes processus.  
 
Pour ce qui est du fscanf en fait, je crée un socket enrobé de sucre en faisant un fdopen(socket, 'r') pour le faire en mode lecture et là à la place de bosser avec des recv je bosse avec des fscanf ce qui serait dans mon cas plus simple car je dois regarder si j'ai telle ou telle requete et en extraire l'url.
 
Mais après plusieurs test, il s'avere en effet que si j'utilise select, je ne peux pas utiliser mon socket sucré ouvert sur le socket sur lequel je fais le select.
 
Tant pis, je me suis démerdé avec un recv suivi d'un strncmp et ça marche mais je trouve pas ça aussi bien que les fscanf mais ce n'est rien
 
merci de ta réponse  :hello:

Reply

Marsh Posté le 03-12-2004 à 22:20:27    

Pourquoi pas sscanf sur le buffer que tu as lu via recv() ?

Reply

Marsh Posté le 03-12-2004 à 23:06:35    

Lam's a écrit :

Pourquoi pas sscanf sur le buffer que tu as lu via recv() ?


 
ah vi c une bonne idée pour virer mon strcmp que j'aime pas trop
 
je te remercie, ça m'est sorti de la tete ça  :hello:

Reply

Marsh Posté le 04-12-2004 à 20:02:05    

Flitz a écrit :

ah vi c une bonne idée pour virer mon strcmp que j'aime pas trop
 
je te remercie, ça m'est sorti de la tete ça  :hello:


Comme j'avais dit...

Sve@r a écrit :

...ben t'as qu'à faire du "recv+sscanf"

Reply

Marsh Posté le 05-12-2004 à 16:51:59    

Tu px donner ton code de ta boucle !?
 
Faut pas oublier de refaire le masque a chaque tour de boucle.
 
Tu as utlisé une socket local pour la communication de tes 2 processus ?
 
edit :
 
Si tu fais un scom = socket(...); pkoi tu réouvres avec un fdopen ??
 
Il te suffi de faire un select sur tes socket, et read/write pour lire/ecrire !?
Et en effet un scanf sur la chaine recuperée avec le read...
 
re edit :
 
Finalement je me pose bcp de question là.
 
Peux tu m'expliquer ta socket enrobé stp ?
Ce que j'ai compris :
 
scom = socket(...);
fd = fdopen (scom);
 
Ensuite tu fais des fscanf sur fd.
 
Alors :
 
Si l'utilisateur click coté navigateur, une requette est envoyée sur la socket.
Le seclect coté serveur, détecte sur fd, puis passe a l'execution de ton fscanf sur fd.
fscanf ne consomme pas la requette, mais déplace uniquement le offset !?
Ca devient compliqué a gérer...


Message édité par hoov le 05-12-2004 à 18:12:08
Reply

Marsh Posté le 05-12-2004 à 23:14:08    

hoov a écrit :

Tu px donner ton code de ta boucle !?
 
Faut pas oublier de refaire le masque a chaque tour de boucle.
 
Tu as utlisé une socket local pour la communication de tes 2 processus ?
 
edit :
 
Si tu fais un scom = socket(...); pkoi tu réouvres avec un fdopen ??
 
Il te suffi de faire un select sur tes socket, et read/write pour lire/ecrire !?
Et en effet un scanf sur la chaine recuperée avec le read...
 
re edit :
 
Finalement je me pose bcp de question là.
 
Peux tu m'expliquer ta socket enrobé stp ?
Ce que j'ai compris :
 
scom = socket(...);
fd = fdopen (scom);
 
Ensuite tu fais des fscanf sur fd.
 
Alors :
 
Si l'utilisateur click coté navigateur, une requette est envoyée sur la socket.
Le seclect coté serveur, détecte sur fd, puis passe a l'execution de ton fscanf sur fd.
fscanf ne consomme pas la requette, mais déplace uniquement le offset !?
Ca devient compliqué a gérer...


 
Salut,
 
sorry mais pour le moment je suis à la bourre, je passe juste pour dire que je n'oublierai pas de mettre le code et explication de tout ce que tu veux savoir une fois fini
 
ce que je peux dire c que je voulais faire des enrobés de sucre (c juste ouvrir un fdopen par dessus) pour utilisé des fscanf car je devais récupérer des liens et je voulais pas m'emmerder avec un buffer
 
pour ce qui est du select, le mélange des deux pose problème et c'est normal aux dires de mon assistant mais mtnt g rien capté à ce qu'il m'a dit :d

Reply

Sujets relatifs:

Leave a Replay

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