$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; }