Thread foreach erzeugt endlos-schleife
(3 answers)
Opened by Mindfoo at 2010-06-08 07:27
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 |