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>


Reply via email to