OVH Cloud OVH Cloud

Un client telnet foireux en exemple...

5 réponses
Avatar
P.C.
Bonjour,

je cherche à faire tourner ce fichier (
http://mircscriptsfrfm.com/defis/client.txt ) qui est fourni avec l'aide de
perl pour windows (version 5.8). Je tourne sous Win2k sp 4.

J'ai essayé de me connecter à un serveur irc (celui que j'ai sur mon pc, et
aussi un vrai serveur undernet): il reçoit les données, mais je ne peux pas
lui en envoyer: ça bloque.

E:\>perl client.txt diemen.nl.eu.undernet.org 7000
[Connected to diemen.nl.eu.undernet.org:7000]
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
nick tototo
Terminating on signal SIGINT(2) (ici j'ai fait ctrl-c)

Est ce que quelqu'un est assez balèze pour m'expliquer ce qui ne marche pas?
iL faut absolument que je comprenne le mécanisme des fork() et c'est la
seule base que j'ai. Evidemment j'ai bien les boules, vu que la seule base
en question est foireuse. Question subsidiaire: existe-t-il une autre
alternative à fork() pour pouvoir exécuter plusieurs processes en parallèle?
Ca m'arrangerait car je n'y comprends strictement que dalle, à fork (merci
de ne pas me préciser perldoc -f fork). En fait je cherche un truc qui
s'apparenterait à new Thead en java...

Merci de vos lumières,

bien à vous,

P.C.

5 réponses

Avatar
ploum
"P.C." wrote in message <c95e9a$4td$:
Est ce que quelqu'un est assez balèze pour m'expliquer ce qui ne marche pas?
iL faut absolument que je comprenne le mécanisme des fork() et c'est la
seule base que j'ai. Evidemment j'ai bien les boules, vu que la seule base
en question est foireuse. Question subsidiaire: existe-t-il une autre
alternative à fork() pour pouvoir exécuter plusieurs processes en parallèle?
Ca m'arrangerait car je n'y comprends strictement que dalle, à fork (merci
de ne pas me préciser perldoc -f fork). En fait je cherche un truc qui
s'apparenterait à new Thead en java...



Bonjour.
Je n'ai pas le temps de regarder le programme, mais je peux essayer
d'expliquer rapidement comment fork est sensé marcher.

Grosso modo, quand tu appelles fork, ton programme se duplique (chaque
fils aura le même environnement, les mêmes FD, etc). Ils ont néanmoins
un numéro de processus différents, ce qui permettra de les distinguer.

Quand on fait p=fork(), celà appelle fork, donc le processus se
dédouble. p contient le numéro du processus enfant crée (si on est le
père), ou 0 (si on est le fils, car lui n'a rien crée).

Typiquement, un code pour faire un serveur est ainsi:

while(paddr¬cept($CLIENT,$SERVEUR)) {
my pid;
if(! defined(pid=fork()) {
die "Impossible de forker"
}
elsif($pid) {
#on est le père, on sait qu'on a un enfant sous le nom de $pid
next; #on attend une nouvelle connexion au serveur
}
else{
#$pid=0, je suis le fils
traiter($client)
}
}

Ah oui, un dernier truc, quand le fils meurt, le père se prend un signal
CHLD (en effet, il peut être utile de savoir si le fils a arrêté de
travaillé). Il faut le traiter, sinon le fils devient un zombie.

Tout ça, c'est sous un unix. Maintenant je ne sais pas comment/si le fork
est implémenté sous windows, ça fait longtemps que je n'ai plus fait de
perl sous windows, il faudra que j'essaie.

--
Dam's

Avatar
Thibault
P.C. wrote:
Bonjour,

je cherche à faire tourner ce fichier (
http://mircscriptsfrfm.com/defis/client.txt ) qui est fourni avec l'aide de
perl pour windows (version 5.8). Je tourne sous Win2k sp 4.

J'ai essayé de me connecter à un serveur irc (celui que j'ai sur mon pc, et
aussi un vrai serveur undernet): il reçoit les données, mais je ne peux pas
lui en envoyer: ça bloque.

E:>perl client.txt diemen.nl.eu.undernet.org 7000
[Connected to diemen.nl.eu.undernet.org:7000]
NOTICE AUTH :*** Looking up your hostname
NOTICE AUTH :*** Checking Ident
NOTICE AUTH :*** Found your hostname
nick tototo
Terminating on signal SIGINT(2) (ici j'ai fait ctrl-c)

Est ce que quelqu'un est assez balèze pour m'expliquer ce qui ne marche pas?
iL faut absolument que je comprenne le mécanisme des fork() et c'est la
seule base que j'ai. Evidemment j'ai bien les boules, vu que la seule base
en question est foireuse. Question subsidiaire: existe-t-il une autre
alternative à fork() pour pouvoir exécuter plusieurs processes en parallèle?
Ca m'arrangerait car je n'y comprends strictement que dalle, à fork (merci
de ne pas me préciser perldoc -f fork). En fait je cherche un truc qui
s'apparenterait à new Thead en java...


Bonjour,
Ce script marche tres bien (en tout cas pour se connecter).
Le truc c'est que le "nick toto" ne suffit généralement pas pour se
connecter à un serveur IRC. il faut en plus se "register"

thibault:/tmp$ perl client.txt irc.librenet.net 6667
[Connected to irc.librenet.net:6667]
nick tutu
-> nick tutu
user a b c d
-> user a b c d
:enix.librenet.fr-irc.net 001 tutu :Welcome to the eu-irc IRC Network
tutu!
...

En ce qui concerne les fork, je ne suis pas vraiment un spécialiste, je
laisserais les autres répondre :) mais en tout cas, ce script semble
marcher correctement ...

A+
--
Thibault

Avatar
P.C.
"Thibault" a écrit dans le message de
news:c96rnn$1t8f$


Bonjour,
Ce script marche tres bien (en tout cas pour se connecter).
Le truc c'est que le "nick toto" ne suffit généralement pas pour se
connecter à un serveur IRC. il faut en plus se "register"



Ouais mais non, bien sur je me doutais qu'on allait me faire cette
réflexion, je connais assez les serveurs irc pour en avoir écrit un. Bien
sur, quand on écrit user a b c d ou quoique ce soit d'autre, ça bloque: pas
d'affichage, pas d'action. J'ai omis de le préciser.

Donc si le script marche chez vous, c'est que c'est un bug de ma version de
Perl. Quelle version de Perl avez-vous et sous quel OS la faites-vous
tourner? Personnellement j'ai Perl 5-8 (
ActivePerl-5.8.0.806-MSWin32-x86.msi ) et ça tourne sous Win2k sp 4. D'apres
l'aide fournie, il semblerait que l'emulation de fork() sous WinNT et
consors souffre de quelques bugs. Est-ce que l'exemple qu'ils donnent tombe
en plein dedans? C'est ce que j'aurais voulu savoir.

Merci à nouveau de vos réponses,

P.C.

Avatar
Mildred
P.C. wrote:
Bonjour,

Est ce que quelqu'un est assez balèze pour m'expliquer ce qui ne marche pas?
iL faut absolument que je comprenne le mécanisme des fork() et c'est la
seule base que j'ai. Evidemment j'ai bien les boules, vu que la seule base
en question est foireuse. Question subsidiaire: existe-t-il une autre
alternative à fork() pour pouvoir exécuter plusieurs processes en parallèle?
Ca m'arrangerait car je n'y comprends strictement que dalle, à fork (merci
de ne pas me préciser perldoc -f fork). En fait je cherche un truc qui
s'apparenterait à new Thead en java...

Merci de vos lumières,

bien à vous,

P.C.




Je n'ai pas grande idée de pourquoi ca ne fonctionen pas mais je peux
taider un peu plus sur les thread Perl (je travaille dessus actuellement).
Une très bonne page: http://www.enstimac.fr/Perl/DocFr/perlthrtut.html

Mildred

--
GnuPGP: http://mildred593.free.fr/gpg/gpg-key.asc
Jabber:
MSN:
Yahoo: mildred59300
AIM: mildred59300
ICQ: 137401065

Avatar
P.C.
"Mildred" a écrit dans le message de
news:40e8397e$0$18113$




Je n'ai pas grande idée de pourquoi ca ne fonctionen pas mais je peux
taider un peu plus sur les thread Perl (je travaille dessus actuellement).
Une très bonne page: http://www.enstimac.fr/Perl/DocFr/perlthrtut.html

Mildred



Merci Mildred. Aux lumieres de ce que j'ai appris, perl pour window ne sait
pas emuler correctement fork, c'est la raison pour laquelle le petit exemple
que j'ai donné ne tournait pas chez moi.