By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
428,853 Members | 2,144 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 428,853 IT Pros & Developers. It's quick & easy.

Server Detector

P: n/a
Hi guys,

I've written a small bit of PHP code who's purpose is to detect my game
server. If the game server is running, I want to display the Launcher and
Client population (two parts of the game program).

So here is what I wrote, minus the address and port :)

<?php
if(($sock = socket_create (AF_INET, SOCK_DGRAM, 0)) < 0)
{
echo "socket_create() failed: reason: " . socket_strerror($sock) . "<BR>";
}
else
{
$server='xxx.xxx.xxx.xxx';
$port=yyyy;
$send=sprintf('%c%c%c%c',24, 0, 0, 0);
$x=socket_sendto($sock,$send,strlen($send)-1,0,$server,$port);

$bar = array($sock);
$select_result = socket_select($bar, $b=null, $c=null, 3);
if ($select_result == true)
{
$y=socket_recvfrom($sock,&$recvbuf,1024,0,&$from,& $port);
$LauncherPopulation = sprintf('%d', $recvbuf[0]);
$ClientPopulation = sprintf('%d', $recvbuf[4]);
echo "<CENTER>The Sovereignty Server<BR>";
echo "is UP</CENTER><BR>";
?>
<CENTER><img src="GreenGem.png" border="0"></CENTER>
<?php
echo $recvbuf . $y . "<BR>";
echo "Launcher Population:" . $LauncherPopulation . "<BR>";
echo "Client Population:" . $ClientPopulation . "<BR><BR>";
}
else
{
echo "<CENTER>The Sovereignty Server<BR>";
echo "is DOWN</CENTER><BR>";
?>
<CENTER><img src="RedGem.png" border="0"></CENTER>
<?php
}
}
socket_close($sock);
?>

This works to some extent. If the server is not running, I get a timeout
after 3 seconds and the red gem graphic is shown. If it is running the
server responds and I get the green gem graphic. The server sends back two
integers for the population

The problem is the $LauncherPopulation and $ClientPopulation values. They
always come up 0 even when there are player in game. The result of the
socket_recvfrom call ($y) is 8, which is the proper size for two integers,
and I know for sure that the server is sending the correct values. But for
some reason, my buffer doesn't appear to be set with them.

What am I doing wrong?

Ron
--
Creation is an act of sheer will
www.rjcyberware.com
Home of "Manifest Destiny" and "Sovereignty"
Jul 17 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
What do you mean exactly that you said "The server sends back two
integers?" Is the server sending two integers printed out as text ("45
64") or two integers in binary? If it's sending back two binary 32 bit
numbers, then you need to use unpack:

$a = unpack("Nlp/Ncp", $recvbuf);
$LauncherPopulation = $a['lp'];
$ClientPopulation = $a['cp'];

I'm assuming big-endian packing order here, since you said you're
getting zero from recvbuf[0] and recvbuf[4].

If the numbers are returned in a text string, then you need to extract
them using sscanf(), preg_match() or whatever.

"Ron Hiler" <rh****@spam.be.gone.rjcyberware.com> wrote in message news:<3fc91acf$1@wobble>...
Hi guys,

I've written a small bit of PHP code who's purpose is to detect my game
server. If the game server is running, I want to display the Launcher and
Client population (two parts of the game program).

So here is what I wrote, minus the address and port :)

<?php
if(($sock = socket_create (AF_INET, SOCK_DGRAM, 0)) < 0)
{
echo "socket_create() failed: reason: " . socket_strerror($sock) . "<BR>";
}
else
{
$server='xxx.xxx.xxx.xxx';
$port=yyyy;
$send=sprintf('%c%c%c%c',24, 0, 0, 0);
$x=socket_sendto($sock,$send,strlen($send)-1,0,$server,$port);

$bar = array($sock);
$select_result = socket_select($bar, $b=null, $c=null, 3);
if ($select_result == true)
{
$y=socket_recvfrom($sock,&$recvbuf,1024,0,&$from,& $port);
$LauncherPopulation = sprintf('%d', $recvbuf[0]);
$ClientPopulation = sprintf('%d', $recvbuf[4]);
echo "<CENTER>The Sovereignty Server<BR>";
echo "is UP</CENTER><BR>";
?>
<CENTER><img src="GreenGem.png" border="0"></CENTER>
<?php
echo $recvbuf . $y . "<BR>";
echo "Launcher Population:" . $LauncherPopulation . "<BR>";
echo "Client Population:" . $ClientPopulation . "<BR><BR>";
}
else
{
echo "<CENTER>The Sovereignty Server<BR>";
echo "is DOWN</CENTER><BR>";
?>
<CENTER><img src="RedGem.png" border="0"></CENTER>
<?php
}
}
socket_close($sock);
?>

This works to some extent. If the server is not running, I get a timeout
after 3 seconds and the red gem graphic is shown. If it is running the
server responds and I get the green gem graphic. The server sends back two
integers for the population

The problem is the $LauncherPopulation and $ClientPopulation values. They
always come up 0 even when there are player in game. The result of the
socket_recvfrom call ($y) is 8, which is the proper size for two integers,
and I know for sure that the server is sending the correct values. But for
some reason, my buffer doesn't appear to be set with them.

What am I doing wrong?

Ron

Jul 17 '05 #2

P: n/a
Thanks for the response, Chung. I was sending the ints binary, which turned
out to be the problem.

I got it, though. My web site server uses a slightly older version of php
(4.2.3, Jan 8 2003), and apparaently the socket_recvfrom() function doesn't
support binary data in that version. I changed to using plaintext instead
of binary, and the values came through fine :)

Ron
--
Creation is an act of sheer will
www.rjcyberware.com
Home of "Manifest Destiny" and "Sovereignty"
Jul 17 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.