webForumDet fria alternativet

timeout problem

1 svar · 202 visningar · startad av henrikjohansson

henrikjohanssonMedlem sedan maj 2000373 inlägg
#1

Här har jag knåpat ihop ett litet script som skall kolla status på half-life servrar. Den skickar iväg en liten sträng och väntar sedan på svar från en server i taget. Jag letade runt som en galning på nätet efter ett bra sätt att lösa så att inte $socket->recv väntar och väntar på ett svar som aldrig kommer (ifall servern är nere eller dyligt), jag hittade lite kod som funkar ibland och ibland inte :D. Skulle nån trevlig prick kunna säga vad som är fel och om jag kan förbättra något..
Jag har inte hållt på med perl innan så ge gärna förslag på vad jag gjort fel :)

#!/usr/bin/perl
use IO::Socket;

hl("cs.ih.nu","27000");
hl("cs.ih.nu");
hl("cs.ih.nu","27016");
hl("cs.ih.nu","27017");
hl("cs.ih.nu","27000");

sub hl {

my($ip, $p) = @_;
$port = $p;
if ($port EQ "") { $port = "27015" }

print "$ip:$port\n";
$socket = IO::Socket::INET->new(PeerPort => "$port",
                                 PeerAddr => "$ip",
                                 Proto    => "udp",
                                 Timeout  => $timeout) or die("Gick inte att skapa en anslutning till $ip");{

$socket->send("ÿÿÿÿinfostring\n");

 vec($rin, fileno($socket), 1) = 1;
	if (select($rout=$rin, undef, $eout=$rin, 2)) {	$socket->recv($rdata, 2048);
	}

if (index($rdata, 'map') == -1) {
	print "timeout\n";
}
else 
{
@hlinfo = split /\\/,$rdata;
for ($x=0;$x<100;$x++)
{
	$data = @hlinfo[$x+1];
	if (@hlinfo[$x] eq "map") { $map = $data };
	if (@hlinfo[$x] eq "players") {$players = $data };
	if (@hlinfo[$x] eq "max") { $max = $data };
	if (@hlinfo[$x] eq "hostname") { $hostname = $data };
}
print "online\n$hostname\n$map\n$players / $max\n";
}
}
print "\n";
}
JojoxxMedlem sedan juni 20004 306 inlägg
#2

Du har inte sättit variabeln $timeout till något värde. Funkar det bättre då?

Genererad på 370 ms · cache AV · v20260730165559-full.f96bc7eb