Witam próbuję sobie stworzyć serwer który:
Po połączeniu bierze dane od użytkownika login-hasło
sprawdza poprawność przez połączenie do strony internetowej
gdy zaloguje się admin ma możliwość opcji wykonania komendy send "jakiś tekst" i jakiś tekst jest wysyłany do klientów i niby mam ten serwer ale jest jeden problem rozsyła on tak naprawdę do póki nie podłączy się druga osoba
Kod:
#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket;
use threads;
use threads::shared;
use LWP::UserAgent;
$|++;
print "$$ - pid servera\n";
our @clients : shared;
@clients = ();
my $user = 0;
my $server = new IO::Socket::INET(
Timeout => 7200,
Proto => "tcp",
LocalPort => 12345,
Reuse => 1,
Listen => 3
);
my $num_of_client = -1;
while (1) {
my $client;
do {
$client = $server->accept;
} until ( defined($client) );
my $peerhost = $client->peerhost();
print "accepted a client $client, $peerhost, id = ", ++$num_of_client, "\n";
my $fileno = fileno $client;
push (@clients, $fileno);
$user++;
my $thr = threads->new( \&processit, $client, $fileno, $peerhost,$user )->detach();
}
sub loguj {
my ($login,$pass) = @_;
my $log = LWP::UserAgent->new;
$log->agent("TraderServer");
my $res = $log->get("http://link");
if ($res->is_success) {
if ($res->as_string =~ /<info>(.*)<\/info>/) {
return $1;
}
}
}
sub processit {
my ($lclient,$lfileno,$lpeer,$id) = @_;
if ($lclient->connected) {
my @act = ();
my $logon = 0;
print $lclient "LOGON PLEASE\n";
while(<$lclient>) {
my $what = $_;
chomp ($what);
$what = "".$what." ";
if ($logon == 0) {
@act = split(' ',$what);
if ($act[0] ne "LOGIN") {
print $lclient "Aby korzystac z servera prosimy o zalogowanie\n";
} else {
if (($act[1] eq "admin") and ($act[2] eq "admin")) {
$logon = 2;
} else {
print "".$act[1]." ".$act[2]."\n";
my $log_err = loguj($act[1],$act[2]);
print $log_err,"\n";
if ($log_err eq "ok") {
$logon = 1;
print $lclient "LOGON SUCCESS\n";
} else {
print $lclient "Dostep zabroniony\n";
}
}
}
} else {
print "klient-> @clients\n";
my $what = $_;
#chomp($what);
# Zalogowany jako administrator
if ($logon == 2) {
$what =~ s/\r//;
$what =~ s/\n//;
$what = "".$what." ";
my @act = ();
print "$what\n";
@act = split(' ',$what);
if ($act[0] eq "send") {
# sygnal w nastepujacy sposob: SYSTEM DATE CODE ACTION CENA SL TP BE DO
if ($what =~ /"(.*)"/) {
#wyslij_syg($1);
foreach my $fn (@clients) {
open my $fh, ">&=$fn" or warn $! and die;
print $fh "$1\n";
}
print "zgloszenie wykonane\n";
}
}
}
#foreach my $fn (@clients) {
# open my $fh, ">&=".$fn."" or warn $! and die;
# print $fh "$lpeer->".$what."\n";
# close ($fh);
#}
}
}
}
close( $lclient);
@clients = grep {$_ !~ $lfileno} @clients;
}
sub wyslij_syg() {
my ($syg) = @_;
foreach my $fn (@clients) {
open my $fh, ">&=$fn" or warn $! and die;
print $fh "$syg\n";
}
}
__END__
Ogólnie to tak:
podłączam się telnetem loguje jako admin wysyłam komendę send "jakaś treść" i jest ok odpalam drugi telnet podłączam sie jako klient i wysyłam znowu komendę send "asdasdasd" (tu u klienta nie pojawi sie tekst do póki nie naciśnie sobie entera) a adminowi blokuje się kolejna możliwość wysłania komendy send...
Czy mógłbym prosić o pomoc ?
Dodam że nie testowałem tego kodu na linuxie pod windowsem jest problem.