$listeners = 3;
my $Q = Thread::Queue->new;
while ($running) {
# Spawn listener threads
for (1..$listeners) {
threads->create(\&handleData)->detach;
}
# BEGIN LISTENING
socket( LISTENSOCK, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ) ) or dienice("socket() error: $!");
setsockopt( LISTENSOCK, SOL_SOCKET, SO_REUSEADDR, pack( 'l', 1 ) ) or dienice("setsockopt() error: $!");
bind( LISTENSOCK, sockaddr_in( $port, INADDR_ANY ) ) or dienice("bind() error: $!");
listen( LISTENSOCK, SOMAXCONN ) or dienice("listen() error: $!");
$log->warning("Listening on port $port");
while ( my $clientAddr = accept( CONNSOCK, LISTENSOCK ) ) {
# put the connection on the queue
$Q->enqueue(fileno(CONNSOCK), $clientAddr );
}
}
sub handleData {
my $tid = threads->tid();
while (1) {
my ($fno, $clientAddr) = $Q->dequeue(2);
next if $fno eq 'STOP';
my ( $clientPort, $clientIp ) = sockaddr_in( $clientAddr );
my $ipStr = inet_ntoa( $clientIp );
open my $socket, '+<&=' . $fno;
while (my $request = <$socket>)
{
chomp $request;
if ($request eq '')
{
$log->warning("($tid) : XML Policy file request from: $ipStr");
print $socket $content.$NULLBYTE;
close $socket;
} else
{
$log->warning("($tid) : Connection from: $ipStr");
print $socket "$ipStr".$NULLBYTE;
close $socket;
}
};
#close $socket;
}
return 1;
}