Hello Dzhuo,
Your server code will not be able to handle multiple clients. You need to
undefine $file after closing the client connection. That is:
close(FILE) if($file);
close($client);
$file = undef; #<-- you omitted this line
}
__END__
__________________
William Ampeh (x3939)
Federal Reserve Board
david
<[EMAIL PROTECTED] To: [EMAIL PROTECTED]
.net> cc:
Subject: Re: coping txt files over a
peer to peer.
01/07/2004 07:01
PM
Please respond
to dzhuo
Tino Arellano wrote:
> Hello folks,
>
> How do I send the file name used by the client so that the server uses
the
> same file name When it is writing it own file.
this can't be done without the client and server agree on how to retrive
the
file name. one reasonable approach is let the client send the filename
first before any newline and then file content, the server will handle the
task of separating the filename and file content. here is one simple
implementation:
#!/usr/bin/perl -w
use strict;
use IO::Socket::INET;
#--
#-- server.pl
#--
my $server = IO::Socket::INET->new(Listen => 5,
LocalAddr => 'localhost',
LocalPort => 5050,
Proto => 'tcp') || die $!;
#-- have we receive the filename from the client yet?
my $file = undef;
while(my $client = $server->accept){
#--
#-- in your code, you have while(<$client>){...}
#-- which is very dangeous because <> will hang if
#-- client and server use a different newline encoding
#-- so please avoid using <$client> in your networking code
#--
#-- 1024 is also a hack which assume your filename will not
#-- be longer than 1K.
#--
while(sysread($client,$_,1024)){
#--
#-- look for a filename before the first newline
#--
if(/(.+?)\n(.*)/ && !$file){
#--
#-- for demo, i will create a filename (sent in by
client)
#-- appending with .by_server. this helps you
#-- to run this demo code without worrying
overwriting
#-- the original file in the same machine
#--
$file = $1 . '.by_server';
open(FILE,">$file") || last;
print FILE $2;
}else{
print FILE if($file);
}
}
close(FILE) if($file);
close($client);
}
__END__
#!/usr/bin/perl -w
use strict;
use IO::Socket::INET;
#--
#-- client.pl
#--
my $server = IO::Socket::INET->new(PeerAddr => 'localhost',
PeerPort => 5050,
Proto => 'tcp') || die $!;
my $file = 'tmp.txt';
#--
#-- send the file name to server.pl
#--
print $server "$file\n";
#--
#-- and then the content
#--
open(FILE,$file) || die $!;
print $server $_ while(<FILE>);
close(FILE);
close($server);
__END__
[panda]$ perl server.pl &
[1] 14329
[panda]$ perl client.pl
[panda]$ ls
tmp.txt tmp.txt.by_server
notice the 'tmp.txt.by_server' file created by the server. other than the
name, the file is identical to tmp.txt.
david
--
sub'_{print"@_ ";* \ = * __ ,\ & \}
sub'__{print"@_ ";* \ = * ___ ,\ & \}
sub'___{print"@_ ";* \ = * ____ ,\ & \}
sub'____{print"@_,\n"}&{_+Just}(another)->(Perl)->(Hacker)
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>