OVH Cloud OVH Cloud

fork sous window avec un socket

5 réponses
Avatar
Bastit Benoît
je me code un server irc en perl
( pour servir interface avec un chat web )

Mon code marche parfaitement sous linux .
Mais sous windows sa marche mal
En faites le fils ne peut pas ecrire tant que le pére na pas lu quelque
chose .
Si quelqu'un a une solution.



my $port = 6668;
my $server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $port,
Listen => SOMAXCONN,
Reuse => 1);
die "Pas reusis a lancer le server" unless $server;
print "[Serveur $0 en attente de connexion]\n";

while ( my $client = $server->accept()) {
$client->autoflush(1);
my $pid = fork ;
if ( $pid) {
print "Je suis le pere est mon fils est $pid.\n";
while ( <$client>) {
next unless /\S/;
//tout le code en attente du client
}
} else {
my @pages , %users ;
sleep(5);
updatemsg($client,@pages,%users);
}

}

5 réponses

Avatar
Bastit Benoît
J'ai retourne le probléme dans tout les sens et mais venu une idee mais
je sais pas comme faire.
Il faudrait que je lit <$client> uniquement quand y a des donnée dedans
y a pas une fonction pour savoir si dans un descriteur y a quelque chose
a lire et qui n'est pas bloquant ?
je test et je fait un sleep(1) jusqua ce qu'il y ai quelque chose a lire





je me code un server irc en perl
( pour servir interface avec un chat web )

Mon code marche parfaitement sous linux .
Mais sous windows sa marche mal
En faites le fils ne peut pas ecrire tant que le pére na pas lu quelque
chose .
Si quelqu'un a une solution.



my $port = 6668;
my $server = IO::Socket::INET->new( Proto => 'tcp',
LocalPort => $port,
Listen => SOMAXCONN,
Reuse => 1);
die "Pas reusis a lancer le server" unless $server;
print "[Serveur $0 en attente de connexion]n";

while ( my $client = $server->accept()) {
$client->autoflush(1);
my $pid = fork ;
if ( $pid) {
print "Je suis le pere est mon fils est $pid.n";
while ( <$client>) {
next unless /S/;
//tout le code en attente du client
}
} else {
my @pages , %users ;
sleep(5);
updatemsg($client,@pages,%users);
}

}


Avatar
Paul Gaborit
À (at) Fri, 27 Oct 2006 00:16:30 +0200,
Bastit Benoît |e|ee.fr> écrivait (wrote):
J'ai retourne le probléme dans tout les sens et mais venu une idee
mais je sais pas comme faire.
Il faudrait que je lit <$client> uniquement quand y a des donnée dedans
y a pas une fonction pour savoir si dans un descriteur y a quelque
chose a lire et qui n'est pas bloquant ?


Pour tester si quelque chose est lisible, on passe en général par
select() (dans sa deuxième syntaxe dans perlfunc).

Par ailleurs, il y a quelque chose qui me chagrine dans votre
programme. Pourquoi est-ce le père qui lit ? En général, on crée un
fils par connexion. Le père ne sert qu'à attendre de nouvelles
tentatives de connexion et à créer un fils à chaque fois.

Une lecture de 'perlipc' pourrait aussi vous servir (la section sur le
Client/Serveur).

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Bastit Benoît
C'est un Serveur, qui peut recevoir ou devoir envoyer des information de
façon indépendante l'une de l'autre !
Si je bloque le serveur sur un lecture il n'enverra jamais rien.
Et peut rester tres longtemps dans cette etats la.

J'ai essaye avec select sois sa marche pas avec les socket ou j'ai pas
reusis a l'utiliser correctement
Merci Benoit
Avatar
Paul Gaborit
À (at) Fri, 27 Oct 2006 16:44:51 +0200,
Bastit Benoît |e|ee.fr> écrivait (wrote):
C'est un Serveur, qui peut recevoir ou devoir envoyer des information
de façon indépendante l'une de l'autre !


Ça n'a pas de sens. Le paradigme Client/Serveur indique que seul le
client peut se connecter au serveur (l'inverse est impossible).

Donc votre serveur attend que des clients se connectent. À chaque
tentative de connexion, il fait un fork. Le fils dialogue avec le
client et le père se remet en attente des demandes de connexion
d'autres clients.

Si votre programme doit pouvoir envoyer des informations quelque part
sans aucune demande d'un client, c'est qu'il est lui-même client d'un
autre serveur.

Si je bloque le serveur sur un lecture il n'enverra jamais rien.
Et peut rester tres longtemps dans cette etats la.


Attention : le serveur c'est à la fois le père et tous ses fils. Le
père ne doit jamais bloquer (afin de gérer les nouvelles
connexions). En fait, le père ne dervait jamais lire quoique ce
soit. Les fils, eux, peuvent bloquer ou non en lecture ou en écriture
selon la nature du protocole qui les lie au client (protocole
synchrone ou asynchrone).

J'ai essaye avec select sois sa marche pas avec les socket ou j'ai pas
reusis a l'utiliser correctement


Lisez perlipc : tout y est (bien) expliqué.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Bastit Benoît
À (at) Fri, 27 Oct 2006 16:44:51 +0200,
Bastit Benoît |e|ee.fr> écrivait (wrote):
C'est un Serveur, qui peut recevoir ou devoir envoyer des information
de façon indépendante l'une de l'autre !


Ça n'a pas de sens. Le paradigme Client/Serveur indique que seul le
client peut se connecter au serveur (l'inverse est impossible).

Donc votre serveur attend que des clients se connectent. À chaque
tentative de connexion, il fait un fork. Le fils dialogue avec le
client et le père se remet en attente des demandes de connexion
d'autres clients.

Si votre programme doit pouvoir envoyer des informations quelque part
sans aucune demande d'un client, c'est qu'il est lui-même client d'un
autre serveur.

Si je bloque le serveur sur un lecture il n'enverra jamais rien.
Et peut rester tres longtemps dans cette etats la.


Attention : le serveur c'est à la fois le père et tous ses fils. Le
père ne doit jamais bloquer (afin de gérer les nouvelles
connexions). En fait, le père ne dervait jamais lire quoique ce
soit. Les fils, eux, peuvent bloquer ou non en lecture ou en écriture
selon la nature du protocole qui les lie au client (protocole
synchrone ou asynchrone).

J'ai essaye avec select sois sa marche pas avec les socket ou j'ai pas
reusis a l'utiliser correctement


Lisez perlipc : tout y est (bien) expliqué.



Quand je dit independante une de l'autre c'est que je peut pas bloquer
un le thread sur la lecture sinon il enverra jammais se qu'il dois
envoyer et je le fait pas forker a la connexion etant donner qu'il dosi
gerer que un seul client .

Mais la problematique est que la discutions serveur <-> client
n'est pas .

client ->server
client <- server

client ->server
client <- server

client ->server
client <- server

Et pour le select, j'ai beau lire la doc j'avoue pas trop comprendre et
meme pas sur que je puisse appliquer a $client