Pokaż wyniki 1 do 8 z 8

Temat: [PERL] serwer wielowatkowy do logowania i rozsylania wiadomosci

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1

    Domyślnie [PERL] serwer wielowatkowy do logowania i rozsylania wiadomosci

    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.
    Ostatnio edytowane przez szlagus : 11-07-2012 - 17:12

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj