Hello,
Everybody, I have code as below. What the code does is receive a
connection and get a file from it, It works ok, but the problem is every
time it receives some files, the memory it occupied augment, and
accumulates every time till it killed by system.
I am beginer of perl, I can't explain why?
I searhc a lot, but they always say "memory will be release by perl
automatically".
#!perl -w
use strict;
use IO::Socket;
my $dir = shift @ARGV;
#....
my $listen_socket = IO::Socket::INET->new (LocalPort => 9999,
Listen => 20,
Proto => 'tcp',
Reuse => 1);
#...
use File::Path;
use threads;
while (1) {
my $connection = $listen_socket->accept ();
if (!defined ($connection)) {
next;
}
# create a new thread to receive files.
threads->create (\&receive_result_file, $connection);
}
sub receive_result_file
{
my $connection = shift (@_);
my $client = $connection->peerhost ();
my $file;
my $buf_len = 2048;
sysread ($connection, $file, $buf_len) or die "无法读取数据。\n";
syswrite ($connection, "OK", 2);
my $buffer;
my $full_file = $dir;
#...
if (!open (THIS_FILE, "+>$full_file")) {
printf "无法打开文件 %s。\n", $full_file;
next;
}
binmode (THIS_FILE);
#...
my $data_len;
while ($data_len = sysread ($connection, $buffer, $buf_len)) {
syswrite ($connection, "OK", 2);
if (!defined (syswrite (THIS_FILE, $buffer, $data_len))) {
close (THIS_FILE);
next;
}
undef $buffer;
}
close (THIS_FILE);
$connection->shutdown (1);
return 0;
}