Net-Socket-NonBlock
view release on metacpan or search on metacpan
NonBlock.pm view on Meta::CPAN
if (!defined($Res))
{
&{$EOF}($Nest, $SRec, 'recv() fatal error');
return;
};
if (!length($Buf))
{
&{$EOF}($Nest, $SRec, 'EOF');
return;
};
$SRec->{'Input'}->[0]->{'Data'} .= $Buf;
$SRec->{'ATime'} = $ATime;
$SRec->{'BytesIn'} += length($Buf);
return length($Buf);
};
my $RecvUDP = sub($$$)
{
my ($Nest, $SRec, $ATime) = @_;
($SRec->{'Socket'} && $Nest->{'Pool'}{$SRec})
or &{$Die}("$SRec: bad socket");
my $BufAvail = $SRec->{'BuffSize'} - &{$BuffSize}($SRec, 'Input');
my $Received = 0;
my $Sel = IO::Select->new($SRec->{'Socket'});
while($Sel->can_read(0) && ($BufAvail > $Received))
{
my $Buf = '';
my $Res = $SRec->{'Socket'}->recv($Buf, $SRec->{'BuffSize'});
if (!defined($Res))
{
&{$EOF}($Nest, $SRec, 'recv() fatal error');
return;
}
(length($Buf) || !$SRec->{'DiscEmpty'})
or next;
$Received += (length($Buf) + 20);
my $tmpHash = {'Data' => $Buf};
&{$UpdatePeer}($tmpHash, $SRec->{'Socket'});
push(@{$SRec->{'Input'}}, $tmpHash);
};
$Received
and $SRec->{'ATime'} = $ATime;
$SRec->{'BytesIn'} += $Received;
return $Received;
};
sub IO($$)
{
my ($Nest, $ErrArray) = @_;
my $Result = '0 but true';
$ErrArray and @{$ErrArray} = ();
$Nest->{'ErrArray'} = $ErrArray;
my $CurTime = time();
my $SRec = undef;
foreach $SRec (values(%{$Nest->{'Pool'}}))
{ &{$Cleanup}($Nest, $SRec); };
my $Socket = undef;
my @SockArray = $Nest->{'Select'}->can_read($Nest->{'SelectT'});
foreach $Socket (@SockArray)
{
$SRec = $Nest->{'S2Rec'}{$Socket};
if ($SRec->{'EOF'} || $SRec->{'Close'} ||
(&{$BuffSize}($SRec, 'Input') >= $SRec->{'BuffSize'}))
{ next; };
if ($SRec->{'Accept'} && $SRec->{'TCP'})
{
$Result++;
&{$Accept}($Nest, $SRec)
and &{$ThrowMsg}(undef, $Nest->{'debug'}, "$SRec: incoming connection accepted")
or &{$ThrowMsg}($Nest, ($^W || $Nest->{'debug'}), "$SRec: Can not accept incoming connection: $@");
$SRec->{'ATime'} = $CurTime;
next;
};
my ($Res) = &{$SRec->{'TCP'} ? $RecvTCP : $RecvUDP}($Nest, $SRec, $CurTime)
or next;
&{$ThrowMsg}(undef, $Nest->{'debug'}, "$SRec: recv $Res bytes");
$Result++;
};
my $Continue = 1;
while ($Continue)
{
$Continue = 0;
my $Socket = undef;
@SockArray = $Nest->{'Select'}->can_write($Nest->{'SelectT'});
foreach $Socket (@SockArray)
{
$SRec = $Nest->{'S2Rec'}{$Socket};
my $OutRec = $SRec->{'Output'}->[0];
(defined($OutRec) && !$SRec->{'EOF'})
( run in 0.614 second using v1.01-cache-2.11-cpan-524268b4103 )