I am passing full code here, I changed it thousands of times without success, my goal is quite simple, just read data from the socket inside the thread
#!/usr/bin/perl
use Getopt::Long;
use IO::Socket::INET;
use threads;
use threads::shared;
#-------------------------------------------------
# BEGIN: Variables Declaration
#-------------------------------------------------
my @replicas;
#-------------------------------------------------
# END: Variables Declaration
#-------------------------------------------------
#-------------------------------------------------
# BEGIN: Command Line Processing
#-------------------------------------------------
$parameters = GetOptions("leader=s" => \$type,
"malicious=s" => \$state);
#-------------------------------------------------
# END: Command Line Processing
#-------------------------------------------------
#-------------------------------------------------
# BEGIN: Socket Server Startup and Checks
#-------------------------------------------------
$connected = 0;
if ($type == "TRUE")
{
$port = 9000;
}
my $server;
while ($connected == 0)
{
$server = IO::Socket::INET->new(
LocalAddr=>'localhost',
LocalPort=>$port,
Type=>SOCK_STREAM,
Proto=>'tcp',
Listen=>10
);
if ($server)
{
print("SERVER: BIND to PORT $port SUCCESFULL\n");
$connected = 1;
#if ($type != "TRUE")
#{
}
else
{
print("SERVER: CANNOT BIND to PORT $port \n");
$port++;
print("SERVER: NEW PORT $port \n");
}
}
$replica = "localhost:$port";
push(@replicas, $replica);
#-------------------------------------------------
# END: Socket Server Startup and Checks
#-------------------------------------------------
#-------------------------------------------------
# BEGIN: ServerControl Thread
#-------------------------------------------------
sub serverControl($time)
{
while (1)
{
print "LISTENING \n";
print @replicas;
foreach $replica ($replicas)
{
print $replica;
if ($replica != "localhost:$port")
{
@repl = split(/:/,$replica);
print $repl;
$clientServerControl = IO::Socket::INET->new(
PeerAddr=>'localhost',
PeerPort=>$repl[1],
Proto =>'tcp'
);
if ($clientServerControl)
{
$keepAlive = "UP:localhost:$replica[1]:ENDUP";
$clientServerControl->send($keepAlive);
$answer = <$socket>;
print $answer;
}
else
{
@replicas = grep { $_ != $replica } @replicas;
}
close($clientServerControl);
}
}
sleep(2);
}
}
#-------------------------------------------------
# END: ServerControl Thread
#-------------------------------------------------
#-------------------------------------------------
# BEGIN: Protocol Thread
#-------------------------------------------------
sub protocol($srv)
{
while(1)
{
# if ($srv->connected())
# {
print "Socket is here :)";
$srv->recv($data,1024);
@recvData = split(/:/,$data);
if ($data)
{
print "-----> $data";
}
print $recvData;
# }
}
}
print "aqui";
$t = threads->create('serverControl');
print $type;
if ($type eq "FALSE")
{
$notifyLeader = IO::Socket::INET->new(
PeerAddr=>'localhost',
PeerPort=>9000,
Proto =>'tcp'
)
or die("LEADER is Offline");
$notify = "ENTER-VIEW:localhost:$port";
print $notify;
if ($notifyLeader->send($notify))
{
print "Mensagem enviada... \n";
}
close($notifyLeader);
}
while(1)
{
print "UP\n";
$client = $server->accept();
$p = threads->create(\&protocol,$client);
}