Socket.pm & print
Jakub Dadak
dadman na brainsys.cz
Pátek Září 11 08:21:15 MEST 1998
Zdravim,
potrebuji shodou okolnosti napsat v perlu jednoduchou aplikaci
se sockety. Resp. jednoducheho klienta a server. Mam vsak problemy
se zapisem funkci print. Server ceka po spusteni na radek od
klienta $line = <Client>; A klient jej posila takto: print "ahoj\n";
Server vsak ceka a nic neprijme, predpokladam, ze to klient
nevyprazdni buffer a ceka na dalsi data, ale mate me ten enter na konci.
Kdyz stejna data poslu takto: $data = "ahoj\n"; syswrite SOCK, $data, 5;
no tak vsechno jede OK. Videl jsem spoustu prikladu s pouzitm print,
proc to nejde me ? Existuje nejaka moznost jako u IO:Socket Autoflush ?
Diky
JD
--
,{(~)~(}, Dadak Jakub Brain Systems s.r.o.
,( ((~) ){){} dadman at brainsys.cz Rybkova 1
())~{)}{{}~()} http://www.brainsys.cz Brno 602 00
`~^ ^~{()} Tel. +420 5 41148704 Fax. +420 5 41148852
~~ Motto: Things are different !
PS: Prikladam kod
Server :
#!/usr/bin/perl -Tw
require 5.002;
use strict;
use Socket;
use Carp;
my $port = shift || 6666;
my $proto = getprotobyname('tcp');
$port = $1 if $port =~ /(\d+)/; # untaint port number
socket(Server, PF_INET, SOCK_STREAM, $proto) or die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1)) or die
"setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY)) || die "bind: $!";
listen(Server,SOMAXCONN) || die "listen: $!";
print "Server started on port $port\n";
my $paddr;
$SIG{CHLD} = \&REAPER;
for ( ; $paddr = accept(Client,Server); close Client) {
print "Connected\n";
my $line;
$line = <Client>;
print Client $line;
}
Client:
#!/usr/bin/perl -w
require 5.002;
use strict;
use Socket;
my ($remote,$port, $iaddr, $paddr, $proto, $line);
$remote = shift || 'localhost';
$port = shift || 6666; # random port
$iaddr = inet_aton($remote) || die "no host: $remote";
$paddr = sockaddr_in($port, $iaddr);
$proto = getprotobyname('tcp');
socket(SOCK, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(SOCK, $paddr) || die "connect: $!";
$line = "ahoj\n";
# syswrite(SOCK, $line, 5); # JEDE !!!!!!!!!!
print SOCK "$line\n"; # NEJEDE !!!!!!!!
$line = <SOCK>;
print "Vysledek = $line\n";
close (SOCK) || die "close: $!";
Další informace o konferenci Perl