User:Pizzahut/msqp.php: Difference between revisions
Jump to navigation
Jump to search
mNo edit summary |
m (This seems to be fixed on Valve's end - getting 130 to 150 servers now.) |
||
Line 1: | Line 1: | ||
This is a code example for querying a Half-Life master server using the PHP language. For querying more than 231 servers it needs to be extended. The purpose of this program is to get a list of TFC servers, there are only about 150 left at the time of writing so it doesn't check for more | This is a code example for querying a Half-Life master server using the PHP language. For querying more than 231 servers it needs to be extended. The purpose of this program is to get a list of TFC servers, there are only about 150 left at the time of writing so it doesn't check for more. | ||
<pre> | <pre> | ||
<?php | <?php |
Revision as of 09:33, 10 December 2010
This is a code example for querying a Half-Life master server using the PHP language. For querying more than 231 servers it needs to be extended. The purpose of this program is to get a list of TFC servers, there are only about 150 left at the time of writing so it doesn't check for more.
<?php /* Version history 1 Initial release. 2 Added option to retry same server if timeout occurs. (This is just a minor update, I should have released it as v1.1.) 2.1 Added more master servers. 2.1.1 Fixed a bug, program didn't terminate if all master servers time out. 2.1.2 Removed a now redundant variable. */ // Method 1: Try a different server if one is timing out. // Method 2: Retry the same server if a timeout occurs. $method = 1; $servers = array( "72.165.61.136:27010", "68.142.72.250:27010", "72.165.61.189:27010", "72.165.61.190:27010", "69.28.151.162:27010"); $server = "hl1master.steampowered.com"; function master_server_timeout(&$fp, $ip) { $port = 27010; $timeout = 1; echo "Connecting to master server \"$ip\".\n"; $fp = fsockopen("udp://$ip", $port, $errno, $errstr, $timeout); if (!$fp) exit("Error $errno : $errstr"); stream_set_timeout($fp, $timeout); // region=world, filter: game=Team Fortress Classic if (!fwrite($fp, "1\xFF0.0.0.0:0\0\\gamedir\\tfc\0")) { fclose($fp); exit("fwrite error\n"); } $s = bin2hex(fread($fp, 6)); $info = stream_get_meta_data($fp); if ($info['timed_out']) { echo "Master server \"$ip\" timed out.\n"; fclose($fp); } else { if ($s !== "ffffffff660a") { fclose($fp); exit("Expected ff ff ff ff 66 0a (hex) but got $s."); } } return $info['timed_out']; } if ($method == 1) { $abort = 1; foreach ($servers as $server_address) { if (!master_server_timeout($fp, $server_address)) { $abort = 0; break; } } if ($abort == 1) exit("All servers timed out, aborting.\n"); } if ($method == 2) { for ($i = 1; $i <= 10; $i++) { if (!master_server_timeout($fp, $server)) break; if ($i == 10) exit("Giving up after 10 tries.\n"); else echo "Retrying ($i).\n"; } } $count = 0; do { $a1 = ord(fread($fp,1)); $info = stream_get_meta_data($fp); if ($info['timed_out']) { echo "Time out occured.\n"; break; } // Let's always read the rest of the address, even if it starts with 0. // This may avoid subsequent problems, but I'm paranoid here. $a2 = ord(fread($fp,1)); $a3 = ord(fread($fp,1)); $a4 = ord(fread($fp,1)); $a5 = ord(fread($fp,1))*256 + ord(fread($fp,1)); if ($a1 != 0) { $count++; echo "$count $a1.$a2.$a3.$a4:$a5\n"; } } while ($a1 != 0); echo "Retrieved $count servers.\n"; fclose($fp); ?>