|
发表于 2009-4-1 08:04:54
|
显示全部楼层
来自 中国–北京–北京
关于读取信息的那个大概就是这样了,至于STEAM的连接查看,要抓数据包看包结构了。- <?php
- /**
- * Define The Commands of Server Query
- *
- */
- define ( "A2A_PING", "\xFF\xFF\xFF\xFF\x69" );
- define ( "A2S_INFO", "\xFF\xFF\xFF\xFF\x54\x53\x6F\x75\x72\x63\x65\x20\x45\x6E\x67\x69\x6E\x65\x20\x51\x75\x65\x72\x79\x00" );
- define ( "A2S_SERVERQUERY_GETCHALLENGE", "\xFF\xFF\xFF\xFF\x57" );
- class HLServer
- {
- private $_data;
- private $_info;
-
- function __construct($serverip, $serverport)
- {
- $udpfp = fsockopen ( "udp://$serverip", "$serverport" );
- fwrite ( $udpfp, A2S_INFO );
- $_data = fread ( $udpfp, 4096 );
- fclose ( $udpfp );
- for($i=0;$i<strlen($_data);$i++)
- {
- if (strlen(dechex(ord($_data[$i]))) == 2)
- {
- $this->_data .= dechex(ord($_data[$i]));
- }
- else
- {
- $this->_data .= "0".dechex(ord($_data[$i]));
- }
- }
- $this->_data = strtoupper($this->_data);
- $this->set_info();
- }
- /**
- * Get the information
- *
- * @param string $_info
- * @return string
- */
- public function get_info($_info)
- {
- return $this->_info[$_info];
- }
-
- /**
- * Looking for the infomation of the server
- *
- */
- private function set_info()
- {
- $_data = substr($this->_data,8);
- $this->_info['Type'] = chr(hexdec(substr($_data,0,2)));
- $_data = substr($_data,2);
- switch (strtoupper(dechex(ord($this->_info['Type']))))
- {
- case "49":
- $this->_info['Version'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['ServerName'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['Map'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['GameDirectory'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['GameDescription'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['AppID'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,4);
- $this->_info['NumberOfPlayers'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['MaximumPlayers'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['NumberOfBots'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- switch ($this->HexToStr(substr($_data,0,2)))
- {
- case 'l':
- $this->_info['Dedicated'] = "Listen Server";
- $_data = substr($_data,2);
- break;
- case 'd':
- $this->_info['Dedicated'] = "Dedicated Server";
- $_data = substr($_data,2);
- break;
- case 'p':
- $this->_info['Dedicated'] = "SourceTV";
- $_data = substr($_data,2);
- break;
- default:
- $this->_info['Dedicated'] = "Unknow Server";
- $_data = substr($_data,2);
- break;
- }
- switch ($this->HexToStr(substr($_data,0,2)))
- {
- case 'l':
- $this->_info['OS'] = "Linux";
- $_data = substr($_data,2);
- break;
- case 'w':
- $this->_info['OS'] = "Windows";
- $_data = substr($_data,2);
- break;
- default:
- $this->_info['OS'] = "Unknow";
- $_data = substr($_data,2);
- break;
- }
- $this->_info['Password'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['Secure'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['GameVersion'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- switch (substr($_data,0,2))
- {
- case "80" :
- $_data = substr($_data,2);
- $this->_info['GamePort'] = (string)hexdec(substr($_data,2).substr($_data,0,2));
- break;
- case "40" :
- break;
- default:
- break;
- }
- break;
- case "6D":
- $this->_info['GameIP'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['ServerName'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['Map'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['GameDirectory'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['GameDescription'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['NumberOfPlayers'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['MaximumPlayers'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['Version'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- switch ($this->HexToStr(substr($_data,0,2)))
- {
- case 'l':
- $this->_info['Dedicated'] = "Listen Server";
- $_data = substr($_data,2);
- break;
- case 'd':
- $this->_info['Dedicated'] = "Dedicated Server";
- $_data = substr($_data,2);
- break;
- case 'p':
- $this->_info['Dedicated'] = "HLTV";
- $_data = substr($_data,2);
- break;
- default:
- $this->_info['Dedicated'] = "Unknow Server";
- $_data = substr($_data,2);
- break;
- }
- switch ($this->HexToStr(substr($_data,0,2)))
- {
- case 'l':
- $this->_info['OS'] = "Linux";
- $_data = substr($_data,2);
- break;
- case 'w':
- $this->_info['OS'] = "Windows";
- $_data = substr($_data,2);
- break;
- default:
- $this->_info['OS'] = "Unknow";
- $_data = substr($_data,2);
- break;
- }
- $this->_info['Password'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['IsMod'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- if ($this->_info['IsMod'] != "0")
- {
- $this->_info['URLInfo'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+2);
- $this->_info['URLDL'] = $this->HexToStr(substr($_data,0,$this->FindDelimiter($_data)));
- $_data = substr($_data,$this->FindDelimiter($_data)+4);
- $this->_info['ModVersion'] = (string)hexdec(substr($_data,6,2).substr($_data,4,2).substr($_data,2,2).substr($_data,0,2));
- $_data = substr($_data,8);
- $this->_info['ModSize'] = (string)hexdec(substr($_data,6,2).substr($_data,4,2).substr($_data,2,2).substr($_data,0,2));
- $_data = substr($_data,8);
- $this->_info['SvOnly'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['CIDLL'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- }
- $this->_info['Secure'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- $this->_info['NumberOfBots'] = (string)hexdec(substr($_data,0,2));
- $_data = substr($_data,2);
- break;
- default:
- break;
- }
- }
-
- /**
- * Find the position of the delimiter string
- *
- * @param string $str
- * @return int
- */
- private function FindDelimiter($str)
- {
- $i = 0;
-
- while($i<strlen($str) && ($str[$i]!='0' || $str[$i+1] !='0'))
- {
- $i+=2;
- }
-
- if($i>=strlen($str))
- {
- return false;
- }
- else
- {
- return $i;
- }
- /*$pos = strpos($str,"00");
- if ($pos%2 == 0)
- {
- return $pos;
- }
- else
- {30007778
- $temppos = $pos + 2;
- while ($str[$pos+2] != "0")
- {
- $str = substr($str,$pos+2);
- $pos = strpos($str,"00");
- $temppos = $temppos + $pos;
- echo $str."<br>";
- echo $pos."<br>";
- }
- return $temppos+1;
-
- }*/
- }
- /**
- * Get the HEX string
- *
- * @param string $hex
- * @return string
- */
- private function HexToStr($hex)
- {
- while ($i=$i+2<strlen($hex)+2)
- {
- $str .= chr(hexdec(substr($hex,0,2)));
- $hex = substr($hex,2);
- }
- return $str;
- }
- /**
- * Get status of the server
- *
- * @return bool
- */
- function GetServerStatus()
- {
- if (! $this->_data)
- {
- return TRUE;
- }
- else
- {
- return FALSE;
- }
-
- }
- function ReturnData()
- {
- return $this->_data;
- }
- }
- ?>
复制代码 |
|