RMoser has asked for the wisdom of the Perl Monks concerning the following question:

FInnally solved this one, or at least found a work around. I think the server I was sending to was choking on the requests coming to quickly. so I did a couple things here.

First I set pipe to not buffer,

$| = 1;

Then I used zipsplit to break up the files into smaller peices, something like this

`/usr/bin/zipsplit -n 30000000 $tmp_file $file`

and then I stuffed the zips into an array and ftp->put each one

foreach $zip (@zip){
$ftp->put($zip);
}

Something along those lines. This took care of the broken pipe error and allowed me to send 130+MB files without any trouble. Hope this helps others that may have come across the same.

Need some help folks, I am using Net::FTP to transmit large zip files, up to 80MB and more, and I often get the cursed "Broken pipe" error back from an IIS server on the other side. I am traversing a 768k frame circuit and a full T1 to get to that box.

$ftp_customer = Net::FTP->new
(
"mis.dev",
Timeout => 180
) or die "Could not connect. \n";
$ftp_customer->login($usr, $pwd) or die "Could not log in \n";
$ftp_customer->binary;
$ftp_customer->cwd("test");
$ftp_customer->put($tmp_file);
$ftp_customer->rename($tmp_file, $zip_file);


Any ideas will be greatly appreciated.
Thanks in advance

Replies are listed 'Best First'.
Re: Net::FTP & Broken pipe error
by VSarkiss (Monsignor) on Sep 09, 2004 at 15:40 UTC

    It's unlikely that Net::FTP is the actual culprit. Can you FTP the files successfully using, say, a command-line client?

    Nonetheless, a couple of things that may be worth trying: See if reducing the block size helps: $ftp_customer = Net::FTP->new(..., BlockSize => 1024);This will likely make things slower too, but may be able to keep from choking the receiving server (if indeed that's the problem).

    You may also want to try breaking up the files into chunks and transmitting them individually. Try it with just one file and a command-line or GUI FTP client first before investing time writing it into your program.

    HTH

      or set the timeout for a longer period (it defaults to 2 minutes):
      $ftp_customer = Net::FTP->new(..., Timeout => 300);


      -Waswas
        Thanks guys very much for the sugestions, I apologize for taking so long to get back, pulled in 100 directions. Anyway, I tried both the time-out and bolk size reecomendations with no success. I also tried breaking them up into multiple zip files earlier, then appending them to the server. This also acting prety funky on the ftp server side so I stopped. The other end needs the file to end in one chunk so I think sending n number of puts is out. Another thing I've looked at is trapping the $SIG, and either ignoring it or pushing past it but that hasnt panned out either. All the while, when I send to other remote FreeBSD servers it works fine. I thing catching or detecting this broken pipe $SIG is going to be the key.