<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.soldat.pl/index.php?action=history&amp;feed=atom&amp;title=Client-Lobby_Protocol_Parsers</id>
		<title>Client-Lobby Protocol Parsers - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.soldat.pl/index.php?action=history&amp;feed=atom&amp;title=Client-Lobby_Protocol_Parsers"/>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Client-Lobby_Protocol_Parsers&amp;action=history"/>
		<updated>2026-05-26T04:34:20Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.soldat.pl/index.php?title=Client-Lobby_Protocol_Parsers&amp;diff=57&amp;oldid=prev</id>
		<title>Freeman: Created page with &quot;Here are some parsers/constructors to help communicate with the lobby using the Client-Lobby_Protocol   ==PHP== ===By PerroAZUL===  It has a function RequestServers. You c...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.soldat.pl/index.php?title=Client-Lobby_Protocol_Parsers&amp;diff=57&amp;oldid=prev"/>
				<updated>2012-08-15T08:31:49Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;Here are some parsers/constructors to help communicate with the lobby using the &lt;a href=&quot;/index.php/Client-Lobby_Protocol&quot; title=&quot;Client-Lobby Protocol&quot;&gt;Client-Lobby_Protocol&lt;/a&gt;   ==PHP== ===By PerroAZUL===  It has a function RequestServers. You c...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Here are some parsers/constructors to help communicate with the lobby using the [[Client-Lobby_Protocol]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==PHP==&lt;br /&gt;
===By PerroAZUL===&lt;br /&gt;
&lt;br /&gt;
It has a function RequestServers. You can pass it an array with the filters you want, and they are optional which means you don't need to write all the filters. The filters you can set are these:&lt;br /&gt;
&lt;br /&gt;
dedicated: true/false/undefined&lt;br /&gt;
noPassworded: true/false/undefined&lt;br /&gt;
noBots: true/false/undefined&lt;br /&gt;
survival: true/false/undefined&lt;br /&gt;
realistic: true/false/undefined&lt;br /&gt;
noBonuses: true/false/undefined&lt;br /&gt;
advance: true/undefined&lt;br /&gt;
weapMod: true/undefined&lt;br /&gt;
notFull: true/false/undefined&lt;br /&gt;
notEmpty: true/false/undefined&lt;br /&gt;
battleye: true/false/undefined&lt;br /&gt;
version: XY for 1.X.Y&lt;br /&gt;
gametype: -1 to 6&lt;br /&gt;
name: can be part of the name (case insensitive)&lt;br /&gt;
country: 2 chars code&lt;br /&gt;
linux: true/false/undefined&lt;br /&gt;
connection: 0/1/2/3 (modem/ISDN/DSL/T1)&lt;br /&gt;
ip: *.*.*.* format&lt;br /&gt;
port: number&lt;br /&gt;
map: name or part of the name (case insensitive)&lt;br /&gt;
&lt;br /&gt;
Here's the code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
define('SOLDATLOBBY_DEFAULT_VERSION', '42');&lt;br /&gt;
&lt;br /&gt;
function ParseServerPacket(&amp;amp;$packet)&lt;br /&gt;
{&lt;br /&gt;
$params = explode(&amp;quot;\n&amp;quot;, $packet);&lt;br /&gt;
$params = explode('©', $params[0]);&lt;br /&gt;
&lt;br /&gt;
if ($params[0] != 'g')&lt;br /&gt;
return null;&lt;br /&gt;
&lt;br /&gt;
$server['version'] = $params[1];&lt;br /&gt;
$server['ip'] = $params[2];&lt;br /&gt;
$server['port'] = $params[3];&lt;br /&gt;
$server['gamestyle'] = $params[4];&lt;br /&gt;
$server['players'] = $params[5];&lt;br /&gt;
$server['maxplayers'] = $params[6];&lt;br /&gt;
$server['map'] = $params[7];&lt;br /&gt;
$server['name'] = $params[8];&lt;br /&gt;
$server['bots'] = $params[9];&lt;br /&gt;
$server['bonusfreq'] = $params[10];&lt;br /&gt;
$server['respawn'] = $params[11];&lt;br /&gt;
$server['connection'] = $params[12];&lt;br /&gt;
$server['survival'] = $params[13];&lt;br /&gt;
$server['realistic'] = $params[14];&lt;br /&gt;
$server['dedicated'] = $params[15];&lt;br /&gt;
$server['linux'] = $params[16];&lt;br /&gt;
$server['passworded'] = $params[17];&lt;br /&gt;
$server['battleye'] = $params[18];&lt;br /&gt;
$server['country'] = $params[19];&lt;br /&gt;
&lt;br /&gt;
return $server;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function RequestServers($filters = null)&lt;br /&gt;
{&lt;br /&gt;
// validate parameters&lt;br /&gt;
&lt;br /&gt;
$dedicated = isset($filters['dedicated']) &amp;amp;&amp;amp; $filters['dedicated'] ? 1 : 0;&lt;br /&gt;
$noPassworded = isset($filters['noPassworded']) &amp;amp;&amp;amp; $filters['noPassworded'] ? 1 : 0;&lt;br /&gt;
$noBots = isset($filters['noBots']) &amp;amp;&amp;amp; $filters['noBots'] ? 1 : 0;&lt;br /&gt;
$survival = isset($filters['survival']) &amp;amp;&amp;amp; $filters['survival'] ? 1 : 0;&lt;br /&gt;
$realistic = isset($filters['realistic']) &amp;amp;&amp;amp; $filters['realistic'] ? 1 : 0;&lt;br /&gt;
$noBonuses = isset($filters['noBonuses']) &amp;amp;&amp;amp; $filters['noBonuses'] ? 1 : 0;&lt;br /&gt;
$advance = isset($filters['advance']) &amp;amp;&amp;amp; $filters['advance'] ? 1 : 0;&lt;br /&gt;
$weapMod = isset($filters['weapMod']) &amp;amp;&amp;amp; $filters['weapMod'] ? 1 : 0;&lt;br /&gt;
$notFull = isset($filters['notFull']) &amp;amp;&amp;amp; $filters['notFull'] ? 1 : 0;&lt;br /&gt;
$notEmpty = isset($filters['notEmpty']) &amp;amp;&amp;amp; $filters['notEmpty'] ? 1 : 0;&lt;br /&gt;
$battleye = isset($filters['battleye']) &amp;amp;&amp;amp; $filters['battleye'] ? 1 : 0;&lt;br /&gt;
&lt;br /&gt;
$version = SOLDATLOBBY_DEFAULT_VERSION;&lt;br /&gt;
if (isset($filters['version']) &amp;amp;&amp;amp; is_numeric($filters['version']) &amp;amp;&amp;amp; strlen(&amp;quot;$filters[version]&amp;quot;) == 2)&lt;br /&gt;
$version = $filters['version'];&lt;br /&gt;
&lt;br /&gt;
$gametype = -1;&lt;br /&gt;
if (isset($filters['gametype']) &amp;amp;&amp;amp; is_numeric($filters['gametype']) &amp;amp;&amp;amp; $filters['gametype'] &amp;gt;= -1 &amp;amp;&amp;amp; $filters['gametype'] &amp;lt;= 6)&lt;br /&gt;
$gametype = $filters['gametype'];&lt;br /&gt;
&lt;br /&gt;
$name = null;&lt;br /&gt;
if (isset($filters['name']))&lt;br /&gt;
$name = $filters['name'];&lt;br /&gt;
&lt;br /&gt;
$country = null;&lt;br /&gt;
if (isset($filters['country']))&lt;br /&gt;
$country = $filters['country'];&lt;br /&gt;
&lt;br /&gt;
// open the socket&lt;br /&gt;
$socket = fsockopen('rr.soldat.pl', 13073);&lt;br /&gt;
if (!$socket)&lt;br /&gt;
return null;&lt;br /&gt;
&lt;br /&gt;
// send the request&lt;br /&gt;
$req = &amp;quot;e©{$version}©{$dedicated}©{$noPassworded}©{$noBots}©{$survival}©{$realistic}©{$noBonuses}©&amp;quot;.&lt;br /&gt;
&amp;quot;{$advance}©{$weapMod}©{$notFull}©{$notEmpty}©{$gametype}©{$battleye}\n&amp;quot;;&lt;br /&gt;
fwrite($socket, $req);&lt;br /&gt;
&lt;br /&gt;
// read the number of servers returned&lt;br /&gt;
$packet = explode('©', fgets($socket, 64));&lt;br /&gt;
if ($packet[0] != 'f') // WTF?&lt;br /&gt;
{&lt;br /&gt;
fclose($socket);&lt;br /&gt;
return null;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
$count = $packet[1];&lt;br /&gt;
$servers = array();&lt;br /&gt;
&lt;br /&gt;
for ($i = 0; $i &amp;lt; $count; $i++)&lt;br /&gt;
{&lt;br /&gt;
$packet = fgets($socket, 256); // 256 should be far enough&lt;br /&gt;
&lt;br /&gt;
if ($packet === FALSE || $packet == &amp;quot;h©©©©©\n&amp;quot;)&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
$server = ParseServerPacket($packet);&lt;br /&gt;
if ($server == null)&lt;br /&gt;
break;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['dedicated']) &amp;amp;&amp;amp; $filters['dedicated'] === false &amp;amp;&amp;amp; $server['dedicated'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['noPassworded']) &amp;amp;&amp;amp; $filters['noPassworded'] === false &amp;amp;&amp;amp; !$server['passworded'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['noBots']) &amp;amp;&amp;amp; $filters['noBots'] === false &amp;amp;&amp;amp; $server['bots'] == 0)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['survival']) &amp;amp;&amp;amp; $filters['survival'] === false &amp;amp;&amp;amp; $server['survival'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['realistic']) &amp;amp;&amp;amp; $filters['realistic'] === false &amp;amp;&amp;amp; $server['realistic'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['notFull']) &amp;amp;&amp;amp; $filters['notFull'] === false &amp;amp;&amp;amp; $server['players'] != $server['maxplayers'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['notEmpty']) &amp;amp;&amp;amp; $filters['notEmpty'] === false &amp;amp;&amp;amp; $server['players'] != 0)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['battleye']) &amp;amp;&amp;amp; $filters['battleye'] === false &amp;amp;&amp;amp; $server['battleye'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['noBonuses']) &amp;amp;&amp;amp; $filters['noBonuses'] === false &amp;amp;&amp;amp; $server['bonusfreq'] == 0)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['linux']) &amp;amp;&amp;amp; ($filters['linux'] XOR $server['linux']))&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['connection']) &amp;amp;&amp;amp; $filters['connection'] != $server['connection'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['ip']) &amp;amp;&amp;amp; $filters['ip'] != $server['ip'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['port']) &amp;amp;&amp;amp; $filters['port'] != $server['port'])&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if (isset($filters['map']) &amp;amp;&amp;amp; strstr(strtolower($server['map']), strtolower($filters['map'])) === FALSE)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if ($name != null &amp;amp;&amp;amp; strstr(strtolower($server['name']), strtolower($name)) === FALSE)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
if ($country != null &amp;amp;&amp;amp; $server['country'] != $country)&lt;br /&gt;
continue;&lt;br /&gt;
&lt;br /&gt;
$servers[] = $server;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
fclose($socket);&lt;br /&gt;
&lt;br /&gt;
return $servers;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here's an example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
header('Content-type: text/plain');&lt;br /&gt;
&lt;br /&gt;
$filters = array(&lt;br /&gt;
'country' =&amp;gt; 'US',&lt;br /&gt;
'notFull' =&amp;gt; true,&lt;br /&gt;
'notEmpty' =&amp;gt; true&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
$servers = RequestServers($filters);&lt;br /&gt;
&lt;br /&gt;
echo 'Showing ' . count($servers) . &amp;quot; servers.\r\n\r\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
foreach ($servers as $server)&lt;br /&gt;
{&lt;br /&gt;
echo &amp;quot;--------------\r\n&amp;quot;;&lt;br /&gt;
foreach ($server as $param =&amp;gt; $value)&lt;br /&gt;
echo &amp;quot;$param: $value\r\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ruby==&lt;br /&gt;
&lt;br /&gt;
===By Flippeh===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;ruby&amp;quot;&amp;gt;&lt;br /&gt;
class Lobby&lt;br /&gt;
  def initialize&lt;br /&gt;
    @update = nil&lt;br /&gt;
    @host = &amp;quot;rr.soldat.pl&amp;quot;&lt;br /&gt;
    @port = 13073&lt;br /&gt;
    @list = []&lt;br /&gt;
    @lobby = Struct.new(&amp;quot;Lobby&amp;quot;, :players, :servers).new(0, 0)&lt;br /&gt;
    @server = Struct.new(&amp;quot;Server&amp;quot;, :version, :ip, :port, :game_style, :players, :maxplayers, :map, :name, :bots, :bonus_freq, :respawn, :connection, :survival, :realistic, :dedicated, :os, :passworded, :battleye, :country)&lt;br /&gt;
    @base_request = &amp;quot;e©42©0©0©0©0©0©0©0©0©0©0©-1©0&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    update_thread&lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  def update_thread&lt;br /&gt;
    @update = Thread.new do&lt;br /&gt;
      loop do&lt;br /&gt;
        update&lt;br /&gt;
        sleep(10)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  def update&lt;br /&gt;
    lobby = nil&lt;br /&gt;
    tmp = []&lt;br /&gt;
   &lt;br /&gt;
    begin&lt;br /&gt;
      lobby = TCPSocket.open(&amp;quot;rr.soldat.pl&amp;quot;, 13073)   &lt;br /&gt;
    rescue SocketError&lt;br /&gt;
      return nil&lt;br /&gt;
    end&lt;br /&gt;
   &lt;br /&gt;
    lobby.puts(&amp;quot;#{@base_request}\n&amp;quot;)&lt;br /&gt;
    @lobby.players = 0&lt;br /&gt;
    @lobby.servers = 0&lt;br /&gt;
   &lt;br /&gt;
    until lobby.eof?&lt;br /&gt;
      b = lobby.gets.chomp&lt;br /&gt;
 &lt;br /&gt;
      if b =~ /^f©(\d+)/ then&lt;br /&gt;
        @lobby.servers = $1.to_i&lt;br /&gt;
       &lt;br /&gt;
      elsif b =~ /^g©(.+)/&lt;br /&gt;
        info = $1.split(&amp;quot;©&amp;quot;)&lt;br /&gt;
        @lobby.players += info[4].to_i&lt;br /&gt;
        tmp &amp;lt;&amp;lt; @server.new(info[0], info[1], info[2], info[3], info[4], info[5], info[6], info[7], info[8], info[9], info[10], info[11], info[12], info[13], info[14], info[15], info[16], info[17], info[18])&lt;br /&gt;
      end&lt;br /&gt;
     &lt;br /&gt;
      @list = tmp&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  def find_by_name(name)&lt;br /&gt;
    res = @list.select { |server| server.name =~ name }&lt;br /&gt;
    return res.length &amp;gt; 0 ? res : nil&lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  def find_by_lang(code)&lt;br /&gt;
    res = @list.select { |server| server.country =~ code }&lt;br /&gt;
    return res.length &amp;gt; 0 ? res : nil&lt;br /&gt;
  end&lt;br /&gt;
 &lt;br /&gt;
  attr_accessor :lobby, :list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
l = Lobby.new&lt;br /&gt;
&lt;br /&gt;
res = l.find_by_name(/dedicated/)&lt;br /&gt;
puts res&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==C++==&lt;br /&gt;
===By jrgp===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * Cross platform lobby client / server lister, by jrgp - 2/14/2011&lt;br /&gt;
 *&lt;br /&gt;
 * Compile me for windows on unix with: i586-mingw32msvc-c++ client.cpp  -lws2_32&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Legacy C &lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdlib&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;
#include &amp;lt;cstring&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Lovely C++ stuff&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;vector&amp;gt;&lt;br /&gt;
#include &amp;lt;string&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#ifdef WIN32&lt;br /&gt;
&lt;br /&gt;
//windows networking &lt;br /&gt;
#define _WIN32_WINNT 0x501&lt;br /&gt;
#include &amp;lt;winsock2.h&amp;gt;&lt;br /&gt;
#include &amp;lt;ws2tcpip.h&amp;gt;&lt;br /&gt;
#else&lt;br /&gt;
&lt;br /&gt;
// Unix networking stuff&lt;br /&gt;
#include &amp;lt;netdb.h&amp;gt;&lt;br /&gt;
#include &amp;lt;netinet/in.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
// Lobby location&lt;br /&gt;
#define LOBBY_HOST &amp;quot;rr.soldat.pl&amp;quot;&lt;br /&gt;
#define LOBBY_PORT &amp;quot;13073&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// Because using std:: everywhere pisses off people, apparently&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
// Simple explode implementation&lt;br /&gt;
vector&amp;lt;string&amp;gt; c_explode(const string &amp;amp;string, const char &amp;amp;sep) {&lt;br /&gt;
&lt;br /&gt;
	// Result stored here&lt;br /&gt;
	vector&amp;lt;string&amp;gt; result;&lt;br /&gt;
&lt;br /&gt;
	// Temp buffer stored here&lt;br /&gt;
	string curr;&lt;br /&gt;
&lt;br /&gt;
	// Characater by character&lt;br /&gt;
	for (unsigned int i = 0, len = string.length(); i &amp;lt; len; i++) {&lt;br /&gt;
		&lt;br /&gt;
		// This match?&lt;br /&gt;
		if (string[i] == sep) {&lt;br /&gt;
&lt;br /&gt;
			// Save buffer if it isn't shit&lt;br /&gt;
			if (curr.length() &amp;gt; 0)&lt;br /&gt;
				result.push_back(curr);&lt;br /&gt;
&lt;br /&gt;
			// No use in getting redundant, now&lt;br /&gt;
			curr = &amp;quot;&amp;quot;;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// No; add this to current buffer&lt;br /&gt;
		else&lt;br /&gt;
			curr += string[i];&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Save a trailing one if it's useful&lt;br /&gt;
	if (curr.length() &amp;gt; 0)&lt;br /&gt;
		result.push_back(curr);&lt;br /&gt;
	&lt;br /&gt;
	// Give&lt;br /&gt;
	return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Server record&lt;br /&gt;
struct server_entry {&lt;br /&gt;
	unsigned short int port;&lt;br /&gt;
	unsigned short int version;&lt;br /&gt;
	string name;&lt;br /&gt;
	string map;&lt;br /&gt;
	string ip;&lt;br /&gt;
	unsigned short int gametype;&lt;br /&gt;
	unsigned short int bonus_freq;&lt;br /&gt;
	unsigned short int connection_type;&lt;br /&gt;
	unsigned short int num_bots;&lt;br /&gt;
	unsigned short int respawn;&lt;br /&gt;
	bool is_linux; // &amp;quot;linux&amp;quot; is apparently a reserved word of some sort&lt;br /&gt;
	bool survival;&lt;br /&gt;
	bool advanced;&lt;br /&gt;
	bool realistic;&lt;br /&gt;
	unsigned short int num_players;&lt;br /&gt;
	unsigned short int max_players;&lt;br /&gt;
	bool be;&lt;br /&gt;
	bool dedicated;&lt;br /&gt;
	bool passworded;&lt;br /&gt;
	string country;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Lobby interface class&lt;br /&gt;
class lobby_client {&lt;br /&gt;
&lt;br /&gt;
	private:&lt;br /&gt;
&lt;br /&gt;
	// Weird  windows &lt;br /&gt;
	#ifdef WIN32&lt;br /&gt;
	WSADATA wsadata;&lt;br /&gt;
	#endif&lt;br /&gt;
&lt;br /&gt;
	// Store actual servers here&lt;br /&gt;
	vector&amp;lt;server_entry&amp;gt; servers;&lt;br /&gt;
&lt;br /&gt;
	public:&lt;br /&gt;
		&lt;br /&gt;
	// Constructor&lt;br /&gt;
	lobby_client() {&lt;br /&gt;
&lt;br /&gt;
		// More weird  windows &lt;br /&gt;
		#ifdef WIN32&lt;br /&gt;
		if (WSAStartup(MAKEWORD(2, 0), &amp;amp;wsadata) != 0) &lt;br /&gt;
			cerr &amp;lt;&amp;lt; &amp;quot;Error initializing winsock &amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Destructor&lt;br /&gt;
	~lobby_client() {&lt;br /&gt;
&lt;br /&gt;
		// End the  windows &lt;br /&gt;
		#ifdef WIN32&lt;br /&gt;
		WSACleanup();&lt;br /&gt;
		#endif&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Number of server's we've got&lt;br /&gt;
	unsigned int num_servers() {&lt;br /&gt;
		return servers.size();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Load the servers&lt;br /&gt;
	bool load_servers() {&lt;br /&gt;
&lt;br /&gt;
		// Request&lt;br /&gt;
		char req[100];&lt;br /&gt;
		sprintf(req, &amp;quot;e%c0%c0%c0%c0%c0%c0%c0%c0%c0%c0%c0%c-1%c0%c0\n&amp;quot;, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169);&lt;br /&gt;
&lt;br /&gt;
		// Address of where we're connecting&lt;br /&gt;
		struct addrinfo hints, *res;&lt;br /&gt;
&lt;br /&gt;
		// Socket handle&lt;br /&gt;
		int sockfd;&lt;br /&gt;
&lt;br /&gt;
		// Initiate hints to nothing&lt;br /&gt;
		memset(&amp;amp;hints, 0, sizeof hints);&lt;br /&gt;
&lt;br /&gt;
		// We only want ipv4&lt;br /&gt;
		hints.ai_family = AF_INET;&lt;br /&gt;
&lt;br /&gt;
		// TCP, not UDP&lt;br /&gt;
		hints.ai_socktype = SOCK_STREAM;&lt;br /&gt;
&lt;br /&gt;
		// Address we're connecting to&lt;br /&gt;
		int ar;&lt;br /&gt;
		if ((ar = getaddrinfo(LOBBY_HOST, LOBBY_PORT, &amp;amp;hints, &amp;amp;res)) != 0) {&lt;br /&gt;
			cerr &amp;lt;&amp;lt; &amp;quot;Error resolving: &amp;quot; &amp;lt;&amp;lt; gai_strerror(ar) &amp;lt;&amp;lt; endl;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Create socket&lt;br /&gt;
		sockfd = socket(res-&amp;gt;ai_family, res-&amp;gt;ai_socktype, res-&amp;gt;ai_protocol);&lt;br /&gt;
&lt;br /&gt;
		// Connect&lt;br /&gt;
		if(connect(sockfd, res-&amp;gt;ai_addr, res-&amp;gt;ai_addrlen) == -1) {&lt;br /&gt;
			cerr &amp;lt;&amp;lt; &amp;quot;Error: &amp;quot; &amp;lt;&amp;lt; strerror(errno) &amp;lt;&amp;lt; endl;&lt;br /&gt;
			return false;&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Kill ram that used&lt;br /&gt;
		freeaddrinfo(res);&lt;br /&gt;
&lt;br /&gt;
		// Debugging output&lt;br /&gt;
		cout &amp;lt;&amp;lt; &amp;quot;Connected&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
		// Send our request (may fail)&lt;br /&gt;
		send(sockfd, req, strlen(req), 0);&lt;br /&gt;
&lt;br /&gt;
		int rst = 0;	// recv result&lt;br /&gt;
		int i = 0;	// buff iterator&lt;br /&gt;
		int j = 0;	// line pos counter&lt;br /&gt;
		int len;&lt;br /&gt;
		char buff[100];	// sock buff&lt;br /&gt;
		char line[500];	// current line holder&lt;br /&gt;
&lt;br /&gt;
		// Parts of each split go here&lt;br /&gt;
		vector&amp;lt;string&amp;gt; parts;&lt;br /&gt;
&lt;br /&gt;
		// Temporary struct for each current server&lt;br /&gt;
		server_entry curr_server;&lt;br /&gt;
		&lt;br /&gt;
		// Go forever until we decide not to&lt;br /&gt;
		while (true) {&lt;br /&gt;
			&lt;br /&gt;
			// Get&lt;br /&gt;
			rst = recv(sockfd, buff, sizeof buff, 0);&lt;br /&gt;
			&lt;br /&gt;
			// Motherfucker&lt;br /&gt;
			if (rst &amp;lt; 1)&lt;br /&gt;
				break;&lt;br /&gt;
&lt;br /&gt;
			// terminate it. very important&lt;br /&gt;
			buff[rst] = '\0';&lt;br /&gt;
&lt;br /&gt;
			// go through each character in buff&lt;br /&gt;
			for (i = 0, len = strlen(buff); i &amp;lt; len; i++) {&lt;br /&gt;
				&lt;br /&gt;
				// a newline? use line, empty it, reset counter&lt;br /&gt;
				if (buff[i] == '\n') {&lt;br /&gt;
&lt;br /&gt;
					// Split that by the copyrihgt symbols&lt;br /&gt;
					parts = c_explode(line, 169);&lt;br /&gt;
&lt;br /&gt;
					// Does this look like a valid server entry?&lt;br /&gt;
					if (parts[0][0] == 'g' &amp;amp;&amp;amp; parts.size() == 20) {&lt;br /&gt;
&lt;br /&gt;
						// Pack that temp struct&lt;br /&gt;
						curr_server.version = atoi(parts[1].c_str());&lt;br /&gt;
						curr_server.ip = parts[2];&lt;br /&gt;
						curr_server.port = atoi(parts[3].c_str());&lt;br /&gt;
						curr_server.gametype = atoi(parts[4].c_str());&lt;br /&gt;
						curr_server.num_players = atoi(parts[5].c_str());&lt;br /&gt;
						curr_server.max_players = atoi(parts[6].c_str());&lt;br /&gt;
						curr_server.map = parts[7];&lt;br /&gt;
						curr_server.name = parts[8];&lt;br /&gt;
						curr_server.num_bots = atoi(parts[9].c_str());&lt;br /&gt;
						curr_server.bonus_freq = atoi(parts[10].c_str());&lt;br /&gt;
						curr_server.respawn = atoi(parts[11].c_str());&lt;br /&gt;
						curr_server.connection_type = atoi(parts[12].c_str());&lt;br /&gt;
						curr_server.survival = parts[13] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.realistic = parts[14] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.dedicated = parts[15] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.is_linux = parts[16] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.passworded = parts[17] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.be = parts[18] == &amp;quot;1&amp;quot;;&lt;br /&gt;
						curr_server.country = parts[19].substr(0, 2);&lt;br /&gt;
&lt;br /&gt;
						// pack that&lt;br /&gt;
						servers.push_back(curr_server);&lt;br /&gt;
					}&lt;br /&gt;
&lt;br /&gt;
					// End of line; clear buffers&lt;br /&gt;
					j = 0;&lt;br /&gt;
					memset(line, '\0', sizeof line);&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				// no; char in current line. &lt;br /&gt;
				else {&lt;br /&gt;
					line[j] = buff[i];	// save char in line buff&lt;br /&gt;
					line[j+1] = '\0';	// terminate it&lt;br /&gt;
					j++;			// increase counter&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		// Kill socket&lt;br /&gt;
		#ifdef WIN32&lt;br /&gt;
			closesocket(sockfd);&lt;br /&gt;
		#else&lt;br /&gt;
			close(sockfd);&lt;br /&gt;
		#endif&lt;br /&gt;
		&lt;br /&gt;
		// Apparent success&lt;br /&gt;
		return true;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Return result&lt;br /&gt;
	vector&amp;lt;server_entry&amp;gt; get_servers() {&lt;br /&gt;
		return servers;&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
	// Usage&lt;br /&gt;
&lt;br /&gt;
	// Load class&lt;br /&gt;
	lobby_client *lc = new lobby_client;&lt;br /&gt;
&lt;br /&gt;
	// Fetch&lt;br /&gt;
	lc-&amp;gt;load_servers();&lt;br /&gt;
&lt;br /&gt;
	// Maybe see how many we got&lt;br /&gt;
	cout &amp;lt;&amp;lt; &amp;quot;Found &amp;quot; &amp;lt;&amp;lt; lc-&amp;gt;num_servers() &amp;lt;&amp;lt; &amp;quot; servers&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
&lt;br /&gt;
	// Get them&lt;br /&gt;
	vector&amp;lt;server_entry&amp;gt; servers = lc-&amp;gt;get_servers();&lt;br /&gt;
&lt;br /&gt;
	// Show them&lt;br /&gt;
	for (int num = servers.size(), i = 0; i &amp;lt; num; i++) {&lt;br /&gt;
		// (refer to any of the fields mentioned by struct near beginning of file)&lt;br /&gt;
		cout &amp;lt;&amp;lt; servers[i].name &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; servers[i].ip &amp;lt;&amp;lt; &amp;quot;:&amp;quot; &amp;lt;&amp;lt; servers[i].port &amp;lt;&amp;lt; endl;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Great Success!&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Freeman</name></author>	</entry>

	</feed>