Bonjour,
J'ai lu certains posts sur le forum qui traitaient de la même chose mais cela n'a pas résolu mon problème.
Je suis parti d'une architecture simple client/server. D'ailleurs elle est encore commentée dans mon code. Ce que je veus faire c'est lire des données dans un fichier les envoyer au serveur, ce dernier fait les traitements qu'il a à faire, et renvoie un résultat au client. Quand le client reçoit cette réponse il va l'écrire dans un autre fichier.
Voici le code que j'ai écrit
Le Client TCP :
Le serveur TCP
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 #!/usr/bin/perl use strict; use IO::Socket; my ($host, $port, $kidpid, $handle, $line); unless (@ARGV == 2) { die "usage: $0 host port" } ($host, $port) = @ARGV; $handle = IO::Socket::INET->new(Proto => "tcp", PeerAddr => $host, PeerPort => $port) or die "can't connect to port $port on $host: $!"; $handle->autoflush(1); print STDERR "[Connected to $host:$port]\n"; die "can't fork: $!" unless defined($kidpid = fork()); if ($kidpid) { # le pere copie la socket dans un fichier open(RV,">>192.168.1.2.rv") || die "Impossible d'ouvrir le fichier\n"; my $line = <$handle>; print RV $line; close RV; # while (defined ($line = <$handle>)) { # print STDOUT $line; #} kill("TERM" => $kidpid); # envoie SIGTERM au fils } else { my @tmp; # copie la donne sur la socket open(TE,"192.168.1.2.se") || die "Impossible d'ouvrir le fichier\n"; while(<TE>) { @tmp = split(' ',$_) ; print("Fichier non vide et $tmp[1] \n"); print $handle $tmp[1]; } close(TE); # while (defined ($line = <STDIN> )) { # print $handle $line; # } } exit;
Le probleme que j'ai c'est : côté serveur la ligne : "line vaut ..." ne s'affiche pas dans la console. Pour qu'elle s'affiche il faut que du coté client je fasse CTRL+C et la cette ligne s'affiche, bien sur vu que j'ai tué le client c'est mort pour lui renvoyer la donnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #!/usr/bin/perl use IO::Socket; use Net::hostent; $server = IO::Socket::INET->new(LocalPort => 8001, Type => SOCK_STREAM, Reuse => 1, Listen => 10 ) or die "Couldn't be a tcp server on port 8001 : $@\n"; while ($client = $server->accept()) { $client->autoflush(1); while (defined ($line = <$client>) ) { print("line vaut $line \n"); print $client $line; } } close($server);
Je comprends pas pourquoi cela ne s'affiche pas directement, quand j'entre quelque chose au clavier, le server reçoit bien ce que j'ai entré et cela est bien recopié sur la partie cliente (code que j'ai laissé entre commentaire). Je ne vois pas quoi les modifications que j'ai faites ammènent un blocage...
Merci de m'éclaircir
Partager