Thread foreach erzeugt endlos-schleife (3 answers)
Opened by Mindfoo at 2010-06-08 07:27

Mindfoo
 2010-06-08 07:27
#138069 #138069
User since
2009-04-03
10 Artikel
BenutzerIn
[default_avatar]
Hallo!
ist schon eine weile her das ich das letzte mal hier war, dieses forum bleibt aber nach wie vor meine anlaufstelle nummer 1 :)

zu meinem problem: ich bin dabei einen neuen 'lobbyserver' für das warzone2100 projekt zu entwerfen, dabei soll der austausch über xml queries geschehen... Das Funktioniert soweit auch recht gut, ich kann über eine telnet verbindung den 'addgame' string an den server senden, er liest ihn aus und speichert dann den string in einem array. Ich möchte nun einen 'changegame' befehl implementieren der es dem host (und nur dem host) ermöglicht veränderte parameter an den lobbyserver zu senden. Wenn ich den change befehl absetze läuft die foreach allerdings endlos und ich weiss nicht wieso...

addgame sub:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sub addgame {
        my ($player_id, $command, $hostip, $hostport, $hostversion, $map, $players, $maxplayers, $techlvl) = @_;
        my @gamedata = [ # Gather Data in one Array
        {'player_id'=>$player_id, 'hostip'=>$hostip, 'hostport'=>$hostport,
        'hostversion'=>$hostversion, 'map'=>$map,
        'players'=>$players, 'maxplayers'=>$maxplayers,
        'techlvl'=>$techlvl} ];
    # Create XML from Array
        my $newgame_xml = new XML::Simple (NoAttr=>1, RootName=>'lobbyquery');
        my @gamedata_xml = $newgame_xml->XMLout(\@gamedata);
        @gamedata_xml = stripxml(@gamedata_xml); # @gamedata xml strip
        chomp(@gamedata_xml);
        writelog("New Game:\n$gamedata_xml[0]");
        push (@gameDB, $gamedata_xml[0])
}


changegame sub:
(prüfe ob player_id == gespeicherte host_id, wenn ja dann...)
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sub chgame {
        my ($player_id, $command, $hostip, $hostport, $hostversion, $map, $players, $maxplayers, $techlvl) = @_;
        foreach(@gameDB) {
                my $host_id = parsexml($_, 'player_id');
                if ($host_id eq $player_id) {
                        print "allowed\n";
                        shift;
                        addgame($player_id, $command, $hostip, $hostport, $hostversion, $map, $players, $maxplayers, $techlvl);
                } else {
                        print "host doesent match\n";
                }
        }
        broadcast($player_id, "chgame: $hostip");
}


und der 'main loop':
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# Handle Client Input
sub client_input {
  my ($kernel, $session, $input) = @_[KERNEL, SESSION, ARG0];
  my $user_id = $session->ID;
  if ($input =~/<lobbyquery>/) {
    my $command = parsexml($input, 'command');
    if ($command eq 'addgame') { # Addgame command received
      # xml > variables
          my $hostip = parsexml($input, 'hostip');
          my $hostport = parsexml($input, 'hostport');
          my $hostversion = parsexml($input, 'hostversion');
          my $map = parsexml($input, 'map');
          my $players = 1;
          my $maxplayers = parsexml($input, 'maxplayers');
          my $techlvl = parsexml($input, 'techlvl');
          # Add the Game to the Lobby Database
          addgame($user_id, $command, $hostip, $hostport, $hostversion, $map, $players, $maxplayers, $techlvl);
    } elsif ($command eq 'chgame') { # Change game command received
      # xml > variables
          my $hostip = parsexml($input, 'hostip');
          my $hostport = parsexml($input, 'hostport');
          my $hostversion = parsexml($input, 'hostversion');
          my $map = parsexml($input, 'map');
          my $players = 1;
          my $maxplayers = parsexml($input, 'maxplayers');
          my $techlvl = parsexml($input, 'techlvl');
          # Change the Game
          chgame($user_id, $command, $hostip, $hostport, $hostversion, $map, $players, $maxplayers, $techlvl);
    }
  } elsif ($input eq 'listgames') {
        if (scalar(@gameDB) == 0) {
          $poe_kernel->post($user_id => send => "no games");
        } else {
          $poe_kernel->post($user_id => send => "@gameDB");
          print @gameDB;
        }
  } elsif ($input =~/^chat (.+)$/) {
        broadcast($user_id, "$user_id: $1");
  } else { $poe_kernel->post($user_id => send => "error"); }
}


Das array enthällt nur einen wert, ich weiss nicht wieso es endlos läuft?!

Hoffe hier weiss jemand nen rat, kritik und verbesserungsvorschläge zum restlichen code werden ebenfalls gerne angenommen :)
-Florian

View full thread foreach erzeugt endlos-schleife