Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

socket perl

1 réponse
Avatar
Alain
bonjour,

je voudrais faire une appli pour faire dialoguer 2 system, pb je n'arrive
pas à les faire dialoguer
dans les 2 sens, je m'explique :

server.pl ouvre un socket sur le port 8888, il doit m'afficher ce qu'il
recoit et repondre au client.pl
qu'il à bien recu les information.
actuellement le serveur est incapable de me dire ce qu'il recoit (je pense
que le client emet bien)

merci pour votre aide

---------------------------------------------------
# server.pl
use strict;
use Socket;

my $port = 8888;
my $proto = getprotobyname('tcp');

socket(SERVER, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(SERVER, SOL_SOCKET, SO_REUSEADDR, 1) or die "setsock: $!";

my $paddr = sockaddr_in($port, INADDR_ANY);

bind(SERVER, $paddr) or die "bind: $!";
listen(SERVER, SOMAXCONN) or die "listen: $!";
print "server listen on port : $port\n";


my $client_addr;
while ($client_addr = accept(CLIENT, SERVER)) {

# accepte la connection
my ($client_port, $client_ip) = sockaddr_in($client_addr);
my $client_ipnum = inet_ntoa($client_ip);
my $client_host = gethostbyaddr($client_ip, AF_INET);

# affiche la connexion et repond au client
print "connection de : $client_host", " ($client_ipnum) \n";
print CLIENT "SRV: welcome ! \n";

# my $line;
# $line = <CLIENT>;
# chop($line);
# until ($line =~ /^FIN/) {
# print $line;
# $line = <CLIENT>;
# chop($line);
# }

close CLIENT;
}

-------------------------------------------
# client.pl

#!/usr/local/bin/perl
#
# Client qui emet les messages.
#
use Socket;
my $port = 8888;
my $protoc = getprotobyname('tcp');
my $adrserv = 'localhost'; # machine locale pour les tests
my $iaddr = inet_aton($adrserv);
my $paddr = sockaddr_in($port,$iaddr);
#
# création de la socket et connexion au serveur
#
socket (SOCK, PF_INET, SOCK_STREAM, $protoc) || die ("Erreur Creation
Socket: $!");
connect(SOCK, $paddr) || die ("Erreur Connect: $!");
#
# Saisie et émission ligne à ligne du message
#

my $line;
while ($line = <SOCK>) {
print "$line\n";
}

print SOCK "CLNT : yo ! \n";
print SOCK "FIN \n";

close SOCK;

1 réponse

Avatar
Ronan Le Hy
Alain a écrit:
server.pl ouvre un socket sur le port 8888, il doit m'afficher ce qu'il
recoit et repondre au client.pl
qu'il à bien recu les information.
actuellement le serveur est incapable de me dire ce qu'il recoit (je pense
que le client emet bien)


Perdu.

-------------------------------------------
# client.pl

[...]
my $line;
while ($line = <SOCK>) {
print "$linen";
}


Ce while ne se termine pas (au moins tant que la socket n'est pas
refermée, ou tant que le serveur n'envoie pas une ligne vide). Donc le
client n'arrive jamais aux deux lignes ci-dessous.

print SOCK "CLNT : yo ! n";
print SOCK "FIN n";

close SOCK;


Si j'ajoute
last if $line =~ /welcome/;
dans le while du client (ainsi que des montants appropriés de ++$|, et
autres
select((select(OUTPUT_FILEHANDLE), $| = 1)[0]);
pour m'assurer que tout se fait imprimer en temps et en heure (perldoc
-q flush)), tout marche bien.

HTH

--
Ronan

The most important thing in the programming language is the name. A
language will not succeed without a good name. I have recently invented
a very good name and now I am looking for a suitable language.
Donald E. Knuth