1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
|
package Client;
use IO::Select;
use IO::Socket;
use strict;
use Carp;
use Sys::Syslog;
use Crypt::HCE_SHA;
my @response;
my $data;
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
if ((scalar(@_) % 2) != 0) {
croak "incorrect number of parameters";
}
while (@_) {
my $key = shift(@_);
my $value = shift(@_);
$self->{$key} = $value;
}
$self->_initialize;
return $self;
}
sub _initialize {
my $self = shift;
my $timeout;
if (!defined($self->{'Server'})) {
croak "Client not initialized properly : Server parameter missing";
}
if (!defined($self->{'Port'})) {
croak "Client not initialized properly : Port parameter missing";
}
if (!defined($self->{'SKey'})) {
croak "Client not initialized properly : SKey parameter missing";
}
if (!eval {$self->{'Socket'} = IO::Socket::INET->new(PeerAddr => $self->{'Server'},
PeerPort => $self->{'Port'},
Proto => 'tcp',
Reuse => 1); })
{
croak "Client couldn't establish a connection to $self->{'Server'}";
}
$self->{'Socket'}->autoflush(1);
srand($$|time()); # poor random generator should be replaced
$self->{'RKey'} = rand(100000000)+1000000;
$self->{'HCE'} = Crypt::HCE_SHA->new($self->{'SKey'}, $self->{'RKey'});
print { $self->{'Socket'} } "$self->{'RKey'}\n";
}
sub send {
my $self = shift;
my @items = @_;
my ($item, $enc_item);
if (defined($self->{'HCE'})) {
foreach $item (@items) {
# syslog('debug','Client encode: %s',$item);
$enc_item = $self->{'HCE'}->hce_block_encode_mime($item);
# syslog('debug','Client sending: %s', $enc_item);
print { $self->{'Socket'} } "$enc_item\n;
}
$enc_item = $self->{'HCE'}->hce_block_encode_mime("+END_OF_LIST");
print { $self->{'Socket'} } "$enc_item\n";
} else {
foreach $item (@items) {
# syslog('debug','Client sending: %s',$item);
print { $self->{'Socket'} } "$item\n";
}
print { $self->{'Socket'} } "+END_OF_LIST\n";
}
return 0;
}
sub recv {
my $self = shift;
my $fh = $self->{'Socket'};
my ($data, $dec_data);
if (defined($self->{'HCE'})) {
$data = "";
undef(@response);
while (<$fh>) {
chomp;
$data = 1;
# syslog('debug','Client recv: %s', $_);
$dec_data = $self->{'HCE'}->hce_block_decode_mime($_);
# syslog('debug','Client decode: %s', $dec_data);
last if ($dec_data eq "+END_OF_LIST");
push @response, $dec_data;
};
if (!defined $data) {
close ($self->{'Socket'});
return $data;
} else {
close ($self->{'Socket'});
return @response;
};
} else {
$data = "";
undef(@response);
while (<$fh>) {
chomp;
$data = 1;
push @response, $_;
};
if (!defined $data) {
close ($self->{'Socket'});
return $data;
} else {
close ($self->{'Socket'});
return @response;
};
}
}
1;
__END__
#------- POD ------
|