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>