#!/usr/bin/perl use Socket; use IO::Socket; my $port = shift || 7808; my (@clients, @servers); my $socket = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $port, Listen => SOMAXCONN, Reuse => 1, ); print "Waiting For Connection current queues:\n"; print "Clients : [", join(", ", map {$_->{'ip'}} @clients), "]\n"; print "Servers : [", join(", ", map {"$_->{'ip'}:$_->{'port'}"} @servers), "]\n"; while (my ($client, $peeraddr) = $socket->accept()) { my $client_ip = inet_ntoa((unpack_sockaddr_in($peeraddr))[1]); print $client "CSUS MASTER IMAGER v0.0\n"; my $response = <$client>; handle_connection($client, $client_ip, $response); print "Waiting For Connection current queues:\n"; print "Clients : [", join(", ", map {$_->{'ip'}} @clients), "]\n"; print "Servers : [", join(", ", map {"$_->{'ip'}:$_->{'port'}"} @servers), "]\n"; } sub handle_connection { my ($client, $ip, $ident) = @_; if ($ident=~/server\s+(\d+)\s*(\d*)/) { my $port = $1; my $n = $2 || 1; print time().": Recieved Server at $ip:$port:$n\n"; print $client "PORT $port RECORDED - DONE\n"; close $client; select(undef,undef,undef,0.5); push @servers, {ip => $ip, port => $port, count => $n}; print "Added to server queue\n"; check_and_pair(); } elsif ($ident=~/client/) { push @clients, {'sock' => $client, 'ip' => $ip}; print "Added to client queue\n"; check_and_pair(); } else { close $client; print "Invalid ident: $ident\n"; } } sub check_and_pair { return unless @servers; my $count = $servers[0]->{'count'}; if (@clients >= $count) { my $s = shift @servers; my $ip = $s->{'ip'}; my $port = $s->{'port'}; print time().": SERVER $ip:$port <-> ("; for (1...$count) { my $c = shift @clients; my $socket = $c->{'sock'}; print $socket "SERVER AT $ip $port\n"; close $c->{'sock'}; print " $c->{'ip'}"; } print " )\n"; } }