<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Server - client question</title>
		<link>http://www.allegro.cc/forums/view/608369</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 23 Sep 2011 17:44:00 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>  Ok so to make a game run smoothly there needs to be latency right?  As in the server waits two ticks to actually do command x or something is this the right way of thinking about it?</p><p>  Also what is the best way to make characters &quot;see&quot; each other without sending the position of everyone on the server?  It would seem that running a function to generate a list of people to tell a specific person hey these people are nearby would be costly in terms of time right and since you can&#39;t be gauranteed that say X can see Y and Z you can&#39;t say Y can see Z since they might be out of range of each other.</p><p>  I am thinking a smaller server 255 or less people could be done with allocating a byte for each player like a quick update, but this structure won&#39;t work with larger amounts of people.  What advice can you all give me to make a server that won&#39;t lagg horribly with just a couple people logged in and make for a good gameplay?</p><p>  What I have right now is a server that will accept incoming connections and allow players to create and login.  Working on coding shoot and pushing bullets/projectiles to a stack.</p><p>  The server is written as follows I realize it may not be perfect and inefficent in some places:</p><p>Server.h
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#ifndef SERVER_H</span>
<span class="number">  2</span><span class="p">#define SERVER_H</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="p">#include "mysocket.h"</span>
<span class="number">  5</span><span class="p">#include "serverdatatypes.h"</span>
<span class="number">  6</span><span class="p">#include "string"</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">class</span> Server
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>  public:
<span class="number"> 14</span>                   Server<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>                   Server<span class="k2">(</span><span class="k1">int</span> MAX_CON<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>                   Server<span class="k2">(</span><span class="k1">int</span> MAX_CON,<span class="k1">int</span> COMMAND_BUFFER<span class="k2">)</span><span class="k2">;</span>    <span class="c">//Max number of connections the server will handle before rejecting incoming</span>
<span class="number"> 17</span>                                                              <span class="c">//connections and how many commands it will buffer before sending CMD_FAIL back to the client</span>
<span class="number"> 18</span>    <span class="k1">void</span>           Initalize<span class="k2">(</span><span class="k1">short</span><span class="k2">)</span><span class="k2">;</span>                          <span class="c">//Calls mysocket::startupand starts listening on a socket for incoming connections.</span>
<span class="number"> 19</span>    <span class="k1">bool</span>           Push_Command<span class="k2">(</span>My_Command <span class="k3">*</span>str<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    My_Command<span class="k3">*</span>    Get_Command<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                             <span class="c">//Shall return a string containing a command or NULL if there are no commands to execute.</span>
<span class="number"> 21</span>    <span class="k1">void</span>           Die<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                                     <span class="c">//Sends signal to start killing threads and closing connections</span>
<span class="number"> 22</span>    <span class="k1">bool</span>           Dead<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>                                    <span class="c">//Are all connections closed, threads terminated, and ready to release memory?</span>
<span class="number"> 23</span>    <span class="c">//STRING BASED SENDING</span>
<span class="number"> 24</span>    <span class="k1">void</span>           SendToAll<span class="k2">(</span>string<span class="k2">)</span><span class="k2">;</span>                         <span class="c">//Sends to everyone on the server announcements and update data.</span>
<span class="number"> 25</span>    <span class="k1">bool</span>           SendToPlayer<span class="k2">(</span><span class="k1">int</span>, string<span class="k2">)</span><span class="k2">;</span>                 <span class="c">//Sends to a certain player.  Returns true for sent false for error.</span>
<span class="number"> 26</span>    <span class="k1">void</span>           SendToList<span class="k2">(</span><span class="k1">int</span>,<span class="k1">int</span> <span class="k3">*</span>,string<span class="k2">)</span><span class="k2">;</span>              <span class="c">//Sends to a list only can be a group or a zone.</span>
<span class="number"> 27</span>    <span class="c">//CHAR * BASED SENDING - UPDATE PACKETS ETC</span>
<span class="number"> 28</span>    <span class="k1">void</span>           c_SendToAll<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>                         <span class="c">//Sends to everyone on the server announcements and update data.</span>
<span class="number"> 29</span>    <span class="k1">bool</span>           c_SendToPlayer<span class="k2">(</span><span class="k1">int</span>, <span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>                 <span class="c">//Sends to a certain player.  Returns true for sent false for error.</span>
<span class="number"> 30</span>    <span class="k1">void</span>           c_SendToList<span class="k2">(</span><span class="k1">int</span>,<span class="k1">int</span> <span class="k3">*</span>,<span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>              <span class="c">//Sends to a list only can be a group or a zone.</span>
<span class="number"> 31</span>                   ~Server<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k1">static</span> <span class="k1">void</span>    Check_Connections<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>                 <span class="c">//Checks connections for data pushes commands onto the stack to be executed later.</span>
<span class="number"> 33</span>    <span class="k1">static</span> <span class="k1">void</span>    Listen<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>
<span class="number"> 35</span>  private:
<span class="number"> 36</span>    <span class="k1">short</span>          Port<span class="k2">;</span>
<span class="number"> 37</span>    <span class="k1">bool</span>           TimeToDie<span class="k2">;</span>
<span class="number"> 38</span>    <span class="k1">bool</span>           oktodie<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 39</span>    <span class="k1">int</span>            MAX_CONNECTIONS<span class="k2">;</span>
<span class="number"> 40</span>    <span class="k1">int</span>            MAX_COMMANDS<span class="k2">;</span>
<span class="number"> 41</span>    mysocket       Listener<span class="k2">;</span>
<span class="number"> 42</span>    mysocket<span class="k3">*</span><span class="k3">*</span>     Connections<span class="k2">;</span>
<span class="number"> 43</span>    My_Command<span class="k3">*</span><span class="k3">*</span>   Command_List<span class="k2">;</span>
<span class="number"> 44</span>    <span class="k1">int</span><span class="k3">*</span>           CONNECT_TIMES<span class="k2">;</span>
<span class="number"> 45</span>
<span class="number"> 46</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 47</span><span class="p">#endif</span>
</div></div><p>

Server.cpp</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include "server.h"</span>
<span class="number">   2</span><span class="p">#include "serverdatatypes.h"</span>
<span class="number">   3</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;winsock2.h&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;windows.h&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;process.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;time.h&gt;</span>
<span class="number">   8</span>
<span class="number">   9</span>
<span class="number">  10</span>
<span class="number">  11</span><span class="k1">using</span> <span class="k1">namespace</span> std<span class="k2">;</span>
<span class="number">  12</span>    Server::Server<span class="k2">(</span><span class="k2">)</span>
<span class="number">  13</span><span class="k2">{</span>
<span class="number">  14</span>    MAX_CONNECTIONS <span class="k3">=</span> <span class="n">50</span><span class="k2">;</span>
<span class="number">  15</span>    MAX_COMMANDS <span class="k3">=</span> <span class="n">250</span><span class="k2">;</span>
<span class="number">  16</span>    Connections <span class="k3">=</span> <span class="k1">new</span> mysocket<span class="k3">*</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  17</span>    Command_List <span class="k3">=</span> <span class="k1">new</span> My_Command<span class="k3">*</span><span class="k2">[</span>MAX_COMMANDS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  18</span>    CONNECT_TIMES <span class="k3">=</span> <span class="k1">new</span> <span class="k1">int</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  19</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> f <span class="k3">&lt;</span> MAX_CONNECTIONS<span class="k2">;</span> f<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  20</span>    <span class="k2">{</span>
<span class="number">  21</span>        Connections<span class="k2">[</span>f<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  22</span>    <span class="k2">}</span>
<span class="number">  23</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> ff <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>ff <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>ff<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  24</span>    <span class="k2">{</span>
<span class="number">  25</span>        Command_List<span class="k2">[</span>ff<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  26</span>    <span class="k2">}</span>
<span class="number">  27</span>    cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Server created with "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_CONNECTIONS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" connections and "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_COMMANDS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" commands"</span><span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  28</span><span class="k2">}</span>
<span class="number">  29</span>
<span class="number">  30</span>
<span class="number">  31</span>    Server::Server<span class="k2">(</span><span class="k1">int</span> MAX_CON<span class="k2">)</span>
<span class="number">  32</span><span class="k2">{</span>
<span class="number">  33</span>    MAX_CONNECTIONS <span class="k3">=</span> MAX_CON<span class="k2">;</span>
<span class="number">  34</span>    MAX_COMMANDS <span class="k3">=</span> MAX_CON<span class="k3">*</span><span class="n">5</span><span class="k2">;</span>
<span class="number">  35</span>    Connections <span class="k3">=</span> <span class="k1">new</span> mysocket<span class="k3">*</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  36</span>    Command_List <span class="k3">=</span> <span class="k1">new</span> My_Command<span class="k3">*</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k3">*</span><span class="n">5</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  37</span>    CONNECT_TIMES <span class="k3">=</span> <span class="k1">new</span> <span class="k1">int</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  38</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> f <span class="k3">&lt;</span> MAX_CONNECTIONS<span class="k2">;</span> f<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  39</span>    <span class="k2">{</span>
<span class="number">  40</span>        Connections<span class="k2">[</span>f<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  41</span>    <span class="k2">}</span>
<span class="number">  42</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> ff <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>ff <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>ff<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  43</span>    <span class="k2">{</span>
<span class="number">  44</span>        Command_List<span class="k2">[</span>ff<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  45</span>    <span class="k2">}</span>
<span class="number">  46</span>    cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Server created with "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_CONNECTIONS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" connections and "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_COMMANDS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" commands"</span><span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  47</span><span class="k2">}</span>
<span class="number">  48</span>
<span class="number">  49</span><span class="c">//Max number of connections the server will handle before rejecting incoming</span>
<span class="number">  50</span><span class="c">//connections and how many commands it will buffer before sending CMD_FAIL back to the client</span>
<span class="number">  51</span>    Server::Server<span class="k2">(</span><span class="k1">int</span> MAX_CON,<span class="k1">int</span> COMMAND_BUFFER<span class="k2">)</span>
<span class="number">  52</span><span class="k2">{</span>
<span class="number">  53</span>    MAX_CONNECTIONS <span class="k3">=</span> MAX_CON<span class="k2">;</span>
<span class="number">  54</span>    MAX_COMMANDS <span class="k3">=</span> COMMAND_BUFFER<span class="k2">;</span>
<span class="number">  55</span>    Connections <span class="k3">=</span> <span class="k1">new</span> mysocket<span class="k3">*</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  56</span>    Command_List <span class="k3">=</span> <span class="k1">new</span> My_Command<span class="k3">*</span><span class="k2">[</span>MAX_COMMANDS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  57</span>    CONNECT_TIMES <span class="k3">=</span> <span class="k1">new</span> <span class="k1">int</span><span class="k2">[</span>MAX_CONNECTIONS<span class="k2">]</span><span class="k2">;</span>
<span class="number">  58</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> f <span class="k3">&lt;</span> MAX_CONNECTIONS<span class="k2">;</span> f<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  59</span>    <span class="k2">{</span>
<span class="number">  60</span>        Connections<span class="k2">[</span>f<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  61</span>    <span class="k2">}</span>
<span class="number">  62</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> ff <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>ff <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>ff<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  63</span>    <span class="k2">{</span>
<span class="number">  64</span>        Command_List<span class="k2">[</span>ff<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  65</span>    <span class="k2">}</span>
<span class="number">  66</span>    cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Server created with "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_CONNECTIONS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" connections and "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>MAX_COMMANDS<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" commands"</span><span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  67</span><span class="k2">}</span>
<span class="number">  68</span>
<span class="number">  69</span><span class="k1">void</span> Server::Initalize<span class="k2">(</span><span class="k1">short</span> PORT<span class="k2">)</span>                                         <span class="c">//Calls mysocket::startup() and starts listening on a socket for incoming connections.</span>
<span class="number">  70</span><span class="k2">{</span>
<span class="number">  71</span>    Port <span class="k3">=</span> PORT<span class="k2">;</span>
<span class="number">  72</span>    Listener.Startup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>    _beginthread<span class="k2">(</span>Listen,<span class="n">0</span>,<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>    _beginthread<span class="k2">(</span>Check_Connections,<span class="n">0</span>,<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span><span class="k2">}</span>
<span class="number">  76</span>
<span class="number">  77</span><span class="k1">void</span> Server::Listen<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span>
<span class="number">  78</span><span class="k2">{</span>
<span class="number">  79</span>   Server <span class="k3">*</span>this_class <span class="k3">=</span> <span class="k2">(</span>Server<span class="k3">*</span><span class="k2">)</span>ptr<span class="k2">;</span>
<span class="number">  80</span>   this_class-&gt;TimeToDie <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  81</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  82</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  83</span>   this_class-&gt;Listener.Listen<span class="k2">(</span>this_class-&gt;Port<span class="k2">)</span><span class="k2">;</span>       <span class="c">//Start listening on listener socket on Port.</span>
<span class="number">  84</span>   cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Now listening for incoming connections on port: "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>this_class-&gt;Port<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  85</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>this_class-&gt;TimeToDie<span class="k2">)</span>
<span class="number">  86</span>   <span class="k2">{</span>
<span class="number">  87</span>       <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Listener.HasData<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  88</span>       <span class="k2">{</span>
<span class="number">  89</span>          <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>z <span class="k3">&lt;</span> this_class-&gt;MAX_CONNECTIONS<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  90</span>          <span class="k2">{</span>
<span class="number">  91</span>              <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number">  92</span>              <span class="k2">{</span>
<span class="number">  93</span>                  cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Accepting new connection on identifier: "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>z<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  94</span>                  this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="k1">new</span> mysocket<span class="k2">(</span>this_class-&gt;Listener.Accept<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>                  this_class-&gt;CONNECT_TIMES<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>                  <span class="k1">break</span><span class="k2">;</span>
<span class="number">  97</span>              <span class="k2">}</span>
<span class="number">  98</span>          <span class="k2">}</span>
<span class="number">  99</span>       <span class="k2">}</span>
<span class="number"> 100</span>   <span class="k2">}</span>
<span class="number"> 101</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 102</span>   _endthread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span><span class="k2">}</span>
<span class="number"> 104</span>
<span class="number"> 105</span><span class="k1">void</span> Server::Check_Connections<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span>                                       <span class="c">//Checks connections for data pushes commands onto the stack to be executed later.</span>
<span class="number"> 106</span><span class="k2">{</span>
<span class="number"> 107</span>    Server <span class="k3">*</span>this_class <span class="k3">=</span> <span class="k2">(</span>Server<span class="k3">*</span><span class="k2">)</span>ptr<span class="k2">;</span>
<span class="number"> 108</span>    this_class-&gt;TimeToDie <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 109</span>    this_class-&gt;oktodie<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 110</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>this_class-&gt;TimeToDie<span class="k2">)</span>
<span class="number"> 111</span>    <span class="k2">{</span>
<span class="number"> 112</span>        <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>z <span class="k3">&lt;</span> this_class-&gt;MAX_CONNECTIONS<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 113</span>        <span class="k2">{</span>
<span class="number"> 114</span>            <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> this_class-&gt;CONNECT_TIMES<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">600000</span><span class="k2">)</span>
<span class="number"> 115</span>            <span class="k2">{</span>
<span class="number"> 116</span>                <span class="k1">delete</span> this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 117</span>                this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 118</span>                cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Dropping connection on socket "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>z<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">" due to inactivity."</span><span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number"> 119</span>            <span class="k2">}</span>
<span class="number"> 120</span>            <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>HasData<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 121</span>            <span class="k2">{</span>
<span class="number"> 122</span>                My_Command <span class="k3">*</span>Pushable_Command<span class="k2">;</span>
<span class="number"> 123</span>                Pushable_Command <span class="k3">=</span> <span class="k1">new</span> My_Command<span class="k2">;</span>
<span class="number"> 124</span>                Pushable_Command-&gt;identifier <span class="k3">=</span> z<span class="k2">;</span>
<span class="number"> 125</span>                <span class="k1">char</span> <span class="k3">*</span>data <span class="k3">=</span> this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Recv<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>                Pushable_Command-&gt;Command <span class="k3">=</span> data<span class="k2">;</span>
<span class="number"> 127</span>                <span class="k1">if</span><span class="k2">(</span>data <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>data,<span class="s">"DISCONNECT"</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 128</span>                <span class="k2">{</span>
<span class="number"> 129</span>                    <span class="k1">do</span><span class="k2">{</span><span class="k2">}</span>
<span class="number"> 130</span>                    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>this_class-&gt;Push_Command<span class="k2">(</span>Pushable_Command<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>                <span class="k2">}</span>
<span class="number"> 132</span>                <span class="k1">else</span> <span class="k2">{</span><span class="k1">delete</span> this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span>this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span><span class="k2">}</span>             <span class="c">//If we get nothing back from a read something is probably wrong cull that connection.</span>
<span class="number"> 133</span>            <span class="k2">}</span>
<span class="number"> 134</span>        <span class="k2">}</span>
<span class="number"> 135</span>    <span class="k2">}</span>
<span class="number"> 136</span>    this_class-&gt;oktodie<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 137</span>    _endthread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span><span class="k2">}</span>
<span class="number"> 139</span><span class="k1">bool</span>  Server::Push_Command<span class="k2">(</span>My_Command <span class="k3">*</span>cmd<span class="k2">)</span>
<span class="number"> 140</span><span class="k2">{</span>
<span class="number"> 141</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>z <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 142</span>    <span class="k2">{</span>
<span class="number"> 143</span>        <span class="k1">if</span><span class="k2">(</span>Command_List<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 144</span>        <span class="k2">{</span>
<span class="number"> 145</span>            Command_List<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> cmd<span class="k2">;</span>
<span class="number"> 146</span>            Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>LOCKED <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 147</span>
<span class="number"> 148</span>            <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>    <span class="c">//Queued up successfully</span>
<span class="number"> 149</span>        <span class="k2">}</span>
<span class="number"> 150</span>    <span class="k2">}</span>
<span class="number"> 151</span>    <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>           <span class="c">//Failed to queue up command queue is full.</span>
<span class="number"> 152</span><span class="k2">}</span>
<span class="number"> 153</span>
<span class="number"> 154</span>My_Command<span class="k3">*</span> Server::Get_Command<span class="k2">(</span><span class="k2">)</span>                                              <span class="c">//Shall return a string containing a command or NULL if there are no commands to execute.</span>
<span class="number"> 155</span><span class="k2">{</span>
<span class="number"> 156</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>z <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 157</span>    <span class="k2">{</span>
<span class="number"> 158</span>        <span class="k1">if</span><span class="k2">(</span>Command_List<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> NULL <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>LOCKED<span class="k2">)</span>
<span class="number"> 159</span>        <span class="k2">{</span>
<span class="number"> 160</span>            Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>LOCKED <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 161</span>            My_Command <span class="k3">*</span>thecommand<span class="k2">;</span>
<span class="number"> 162</span>            thecommand <span class="k3">=</span> <span class="k1">new</span> My_Command<span class="k2">;</span>
<span class="number"> 163</span>            thecommand-&gt;identifier <span class="k3">=</span> Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>identifier<span class="k2">;</span>
<span class="number"> 164</span>            thecommand-&gt;Command <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Command<span class="k2">)</span><span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 165</span>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>thecommand-&gt;Command,Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Command<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>            <span class="k1">delete</span> Command_List<span class="k2">[</span>z<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 167</span>            Command_List<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 168</span>            <span class="k1">return</span> thecommand<span class="k2">;</span>
<span class="number"> 169</span>        <span class="k2">}</span>
<span class="number"> 170</span>    <span class="k2">}</span>
<span class="number"> 171</span>    <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 172</span><span class="k2">}</span>
<span class="number"> 173</span><span class="k1">bool</span> Server::Dead<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 174</span><span class="k2">{</span>
<span class="number"> 175</span>    <span class="k1">if</span><span class="k2">(</span>oktodie<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> oktodie<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span>
<span class="number"> 176</span>    <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 177</span>    <span class="k1">else</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 178</span><span class="k2">}</span>
<span class="number"> 179</span><span class="k1">void</span> Server::Die<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 180</span><span class="k2">{</span>
<span class="number"> 181</span>    TimeToDie <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 182</span><span class="k2">}</span>
<span class="number"> 183</span><span class="k1">void</span> Server::SendToAll<span class="k2">(</span>string data<span class="k2">)</span>                         <span class="c">//Sends to everyone on the server announcements and update data.</span>
<span class="number"> 184</span><span class="k2">{</span>
<span class="number"> 185</span>   <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>MAX_CONNECTIONS<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 186</span>   <span class="k2">{</span>
<span class="number"> 187</span>       <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k2">)</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span>   <span class="k2">}</span>
<span class="number"> 189</span><span class="k2">}</span>
<span class="number"> 190</span><span class="k1">bool</span> Server::SendToPlayer<span class="k2">(</span><span class="k1">int</span> x,string data<span class="k2">)</span>                 <span class="c">//Sends to a certain player.  Returns true for sent false for error.</span>
<span class="number"> 191</span><span class="k2">{</span>
<span class="number"> 192</span>    <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k2">)</span><span class="k1">return</span> Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 193</span>    <span class="k1">else</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 194</span><span class="k2">}</span>
<span class="number"> 195</span><span class="k1">void</span> Server::SendToList<span class="k2">(</span><span class="k1">int</span> y,<span class="k1">int</span> <span class="k3">*</span>x,string data<span class="k2">)</span>              <span class="c">//Sends to a list only can be a group or a zone.</span>
<span class="number"> 196</span><span class="k2">{</span>
<span class="number"> 197</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>z<span class="k3">&lt;</span>y<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 198</span>    <span class="k2">{</span>
<span class="number"> 199</span>        <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">[</span>z<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span>Connections<span class="k2">[</span>x<span class="k2">[</span>z<span class="k2">]</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data.c_str<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 200</span>    <span class="k2">}</span>
<span class="number"> 201</span><span class="k2">}</span>
<span class="number"> 202</span>
<span class="number"> 203</span><span class="k1">void</span> Server::c_SendToAll<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>data<span class="k2">)</span>                         <span class="c">//Sends to everyone on the server announcements and update data.</span>
<span class="number"> 204</span><span class="k2">{</span>
<span class="number"> 205</span>   <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>MAX_CONNECTIONS<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 206</span>   <span class="k2">{</span>
<span class="number"> 207</span>       <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k2">)</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 208</span>   <span class="k2">}</span>
<span class="number"> 209</span><span class="k2">}</span>
<span class="number"> 210</span><span class="k1">bool</span> Server::c_SendToPlayer<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">char</span> <span class="k3">*</span>data<span class="k2">)</span>                 <span class="c">//Sends to a certain player.  Returns true for sent false for error.</span>
<span class="number"> 211</span><span class="k2">{</span>
<span class="number"> 212</span>    <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k2">)</span><span class="k1">return</span> Connections<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>    <span class="k1">else</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 214</span><span class="k2">}</span>
<span class="number"> 215</span><span class="k1">void</span> Server::c_SendToList<span class="k2">(</span><span class="k1">int</span> y,<span class="k1">int</span> <span class="k3">*</span>x,<span class="k1">char</span> <span class="k3">*</span>data<span class="k2">)</span>              <span class="c">//Sends to a list only can be a group or a zone.</span>
<span class="number"> 216</span><span class="k2">{</span>
<span class="number"> 217</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>z<span class="k3">&lt;</span>y<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 218</span>    <span class="k2">{</span>
<span class="number"> 219</span>        <span class="k1">if</span><span class="k2">(</span>Connections<span class="k2">[</span>x<span class="k2">[</span>z<span class="k2">]</span><span class="k2">]</span><span class="k2">)</span>Connections<span class="k2">[</span>x<span class="k2">[</span>z<span class="k2">]</span><span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Send<span class="k2">(</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 220</span>    <span class="k2">}</span>
<span class="number"> 221</span><span class="k2">}</span>
<span class="number"> 222</span>
<span class="number"> 223</span>    Server::~Server<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 224</span><span class="k2">{</span>
<span class="number"> 225</span>    <span class="k1">int</span> f<span class="k2">;</span>
<span class="number"> 226</span>    <span class="k1">for</span><span class="k2">(</span>    f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>f <span class="k3">&lt;</span> MAX_CONNECTIONS<span class="k2">;</span>f<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 227</span>    <span class="k2">{</span>
<span class="number"> 228</span>        <span class="k1">delete</span> Connections<span class="k2">[</span>f<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 229</span>    <span class="k2">}</span><span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> Connections<span class="k2">;</span>
<span class="number"> 230</span>    <span class="k1">for</span><span class="k2">(</span>    f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>f <span class="k3">&lt;</span> MAX_COMMANDS<span class="k2">;</span>f<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 231</span>    <span class="k2">{</span>
<span class="number"> 232</span>        <span class="k1">delete</span> Command_List<span class="k2">[</span>f<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 233</span>    <span class="k2">}</span><span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> Command_List<span class="k2">;</span>
<span class="number"> 234</span>    Listener.Shutdown<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 235</span><span class="k2">}</span>
</div></div><p>

main.cpp
</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>    Test_Server <span class="k3">=</span> <span class="k1">new</span> Server<span class="k2">(</span>MAX_CONNECTIONS_TO_SERVER<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    Test_Server-&gt;Initalize<span class="k2">(</span><span class="n">27115</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>
<span class="number">  8</span>    My_Command<span class="k3">*</span> testcommand<span class="k2">;</span>
<span class="number">  9</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_518.html" target="_blank">kbhit</a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 10</span>    <span class="k2">{</span>
<span class="number"> 11</span>        <span class="k1">do</span>
<span class="number"> 12</span>        <span class="k2">{</span>
<span class="number"> 13</span>            testcommand <span class="k3">=</span> Test_Server-&gt;Get_Command<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>            <span class="k1">if</span><span class="k2">(</span>testcommand<span class="k2">)</span>
<span class="number"> 15</span>            <span class="k2">{</span>
<span class="number"> 16</span>                cout<span class="k3">&lt;</span><span class="k3">&lt;</span>testcommand-&gt;Command<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number"> 17</span>                HandleCommand<span class="k2">(</span>testcommand<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>            <span class="k2">}</span>
<span class="number"> 19</span>        <span class="k2">}</span>
<span class="number"> 20</span>        <span class="k1">while</span><span class="k2">(</span>testcommand<span class="k2">)</span><span class="k2">;</span><span class="c">//run all commands in queue</span>
<span class="number"> 21</span>    <span class="k2">}</span>
<span class="number"> 22</span>    Test_Server-&gt;Die<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>Test_Server-&gt;Dead<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 25</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Sat, 17 Sep 2011 10:51:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931337#target">David Sopala</a> said:</div><div class="quote"><p>Ok so to make a game run smoothly there needs to be latency right?  As in the server waits two ticks to actually do command x or something is this the right way of thinking about it?</p></div></div><p>
No. Why would you think that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Sat, 17 Sep 2011 15:13:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931337#target">David Sopala</a> said:</div><div class="quote"><p>As in the server waits two ticks to actually do command x or something is this the right way of thinking about it?</p></div></div><p>

Your server listens for the client(s) for however many ms you set it. </p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Also what is the best way to make characters &quot;see&quot; each other without sending the position of everyone on the server?</p></div></div><p>

This is possible but only if your simulation is deterministic. You can only take input from your client(s) and send the update from your server with all the positions you changed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Sat, 17 Sep 2011 15:28:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>From what I figure- the clients should only send updates when their state changes right?  ie 1000xxxx (think up, right, down, left, 4 reserved bits) then lets say they walk up for some amount of time then they stop moving now we get a second packet 0000xxxx and the server stops them moving.  Is this a good idea? It seems to have the least amount of traffic in a design that I can think up.  The only thing I worry about is the server could potentially get hung up with someone flooding it with commands (repeated presses of a key like up thus sending many update packets) and as you can see from the server design that could cause lagg.  Maybe I will need to code a lockout timer 5 commands per 5 seconds or something like that ideas?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Sun, 18 Sep 2011 01:12:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Another thing you might try doing though I&#39;m not sure what the code looks like for it is synchronizing the clients and the server so that the server expects to receive a message from the clients within some time frame. The clients basically have a timer that is in sync with the server and only send a message within a specific timeframe. The idea would work similarly for the server side as well. The gameloop would execute in sync with the client and the server and the updates ( your controls, scores, etc.) would be sent to your clients and the server sometime after the gameloop.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Sun, 18 Sep 2011 06:17:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I added a thread to run updates on the players and such; while the other threads if they find nothing will yeild their timeslice to the update thread to make sure things keep going smoothly(so I hope).</p><p>Posted before I realized I don&#39;t have all the threads posted....</p><p>So I have the following threads:</p><p>Check for incoming connections - yields there is enough time for it to come back only checking one socket in this case so it is quick doesn&#39;t need to check twice.</p><p>Check for data on existing connections - does not yield connections could have data any second now....</p><p>Pull commands off the stack and execute them - yields with no commands</p><p>Update players, NPCs, Monsters, bullets, etc
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Sun, 18 Sep 2011 09:22:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931457#target">David Sopala</a> said:</div><div class="quote"><p>I added a thread to run updates on the players and such; while the other threads if they find nothing will yeild their timeslice to the update thread to make sure things keep going smoothly(so I hope).</p></div></div><p>

Does that mean the server is always listening? If not how do you fix missing packets or are you using udp, thats the norm for games.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Sun, 18 Sep 2011 11:40:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You have a thread that will always be checking out on the listener.  You also have a thread that will always be checking for incoming commands from the clients/players.</p><p>TCP actually - The server doesn&#39;t &quot;miss&quot; packets although I could put an ACK in there to make sure the client knows the server got the data...  The server queues commands up with an identifier and a char* with the command and params.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> Server::Initalize<span class="k2">(</span><span class="k1">short</span> PORT<span class="k2">)</span>                                         <span class="c">//Calls mysocket::startup() and starts listening on a socket for incoming connections.</span>
  <span class="k2">{</span>
      Port <span class="k3">=</span> PORT<span class="k2">;</span>
      Listener.Startup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
      _beginthread<span class="k2">(</span>Listen,<span class="n">0</span>,<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
      _beginthread<span class="k2">(</span>Check_Connections,<span class="n">0</span>,<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span><span class="k2">)</span><span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k2">}</span>
</pre></div></div><p>

So I start two threads to handle communications and new connections.  Now this main thread goes back to main and basicly goes and grabs commands off a stack the server is pushing commands onto.  Now lets say people don&#39;t send any commands (Test_Server-&gt;Get_Command() == NULL) - there is nothing for my guy here to do so he yields that timeslice to someone who needs it.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_518.html" target="_blank">kbhit</a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
    <span class="k2">{</span>
        <span class="k1">do</span>
        <span class="k2">{</span>
            testcommand <span class="k3">=</span> Test_Server-&gt;Get_Command<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
            <span class="k1">if</span><span class="k2">(</span>testcommand<span class="k2">)</span>
            <span class="k2">{</span>
                HandleCommand<span class="k2">(</span>testcommand<span class="k2">)</span><span class="k2">;</span>
            <span class="k2">}</span>
            <span class="k1">else</span> SwitchToThread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
        <span class="k1">while</span><span class="k2">(</span>testcommand<span class="k2">)</span><span class="k2">;</span>
    <span class="k2">}</span>
</pre></div></div><p>
It also does this while listening on incoming connections for a performance boost I hope.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> Server::Listen<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   Server <span class="k3">*</span>this_class <span class="k3">=</span> <span class="k2">(</span>Server<span class="k3">*</span><span class="k2">)</span>ptr<span class="k2">;</span>
<span class="number">  4</span>   this_class-&gt;TimeToDie <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  5</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  6</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  7</span>   this_class-&gt;Listener.Listen<span class="k2">(</span>this_class-&gt;Port<span class="k2">)</span><span class="k2">;</span>       <span class="c">//Start listening on listener socket on Port.</span>
<span class="number">  8</span>   cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Now listening for incoming connections on port: "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>this_class-&gt;Port<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number">  9</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>this_class-&gt;TimeToDie<span class="k2">)</span>
<span class="number"> 10</span>   <span class="k2">{</span>
<span class="number"> 11</span>       <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Listener.HasData<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 12</span>       <span class="k2">{</span>
<span class="number"> 13</span>          <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> z <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>z <span class="k3">&lt;</span> this_class-&gt;MAX_CONNECTIONS<span class="k2">;</span>z<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 14</span>          <span class="k2">{</span>
<span class="number"> 15</span>              <span class="k1">if</span><span class="k2">(</span>this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 16</span>              <span class="k2">{</span>
<span class="number"> 17</span>                  cout<span class="k3">&lt;</span><span class="k3">&lt;</span><span class="s">"Accepting new connection on identifier: "</span><span class="k3">&lt;</span><span class="k3">&lt;</span>z<span class="k3">&lt;</span><span class="k3">&lt;</span>endl<span class="k2">;</span>
<span class="number"> 18</span>                  this_class-&gt;Connections<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <span class="k1">new</span> mysocket<span class="k2">(</span>this_class-&gt;Listener.Accept<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>                  this_class-&gt;CONNECT_TIMES<span class="k2">[</span>z<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_103.html" target="_blank">clock</a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>                  <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 21</span>              <span class="k2">}</span>
<span class="number"> 22</span>          <span class="k2">}</span>
<span class="number"> 23</span>       <span class="k2">}</span><span class="k1">else</span> SwitchToThread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>   <span class="k2">}</span>
<span class="number"> 25</span>   this_class-&gt;oktodie<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 26</span>   _endthread<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span><span class="k2">}</span>
</div></div><p>

and if you want to see how I handle commands:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> HandleCommand<span class="k2">(</span>My_Command<span class="k3">*</span> cmd<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">char</span> <span class="k3">*</span>str <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>cmd-&gt;Command<span class="k2">)</span><span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  4</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>str,cmd-&gt;Command<span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <span class="k1">char</span> <span class="k3">*</span> pch<span class="k2">;</span>
<span class="number">  6</span>    pch <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_779.html" target="_blank">strtok</a> <span class="k2">(</span>str,<span class="s">"_"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>x <span class="k3">&lt;</span> NUM_SERVER_FUNCTIONS<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  8</span>    <span class="k2">{</span>
<span class="number">  9</span>        <span class="k1">if</span><span class="k2">(</span>pch <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_754.html" target="_blank">strcmp</a><span class="k2">(</span>pch,Functions<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Command<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span>
<span class="number"> 10</span>        <span class="k2">{</span>
<span class="number"> 11</span>            <span class="k2">(</span><span class="k3">*</span>Functions<span class="k2">[</span>x<span class="k2">]</span><span class="k3">-</span><span class="k3">&gt;</span>Funct<span class="k2">)</span><span class="k2">(</span>cmd<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>        <span class="k2">}</span>
<span class="number"> 13</span>    <span class="k2">}</span>
<span class="number"> 14</span>    <span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> str<span class="k2">;</span>
<span class="number"> 15</span>    <span class="k1">delete</span> cmd<span class="k2">;</span>
<span class="number"> 16</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Mon, 19 Sep 2011 02:10:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931337#target">David Sopala</a> said:</div><div class="quote"><p>Ok so to make a game run smoothly there needs to be latency right? As in the server waits two ticks to actually do command x or something is this the right way of thinking about it?</p></div></div><p>

No. You&#39;re not even vaguely on the right track. You haven&#39;t even begun to address the real challenge of making a fun and responsive network game which is latency hiding. </p><p>Have you even established how you are going to maintain consistent state? This will depend a lot on the type of game you are making. For example, for an FPS you&#39;ll want the absolute state to be server-side with each client seeing some predictive subset of the state. For an RTS, on the other hand, a good solution is to use a deterministic lock-step engine.</p><p>Once you&#39;ve established this, you&#39;ll then want to work on decoupling game-play from communication as much as possible so that the game flows smoothly despite latency spikes.  </p><p>Finally comes the hard bit: hiding latency and making the state displayed to the user believable despite the inevitable network latency.  This involves interpolation, extrapolation, prediction and reconciliation. Moreover, it requires making the correct game design choices in the first place.  You&#39;ll see this is all the best online multiplayer games: movement, weapon and gameplay mechanics are chosen to be predictable to within a reasonable degree of accuracy so that reconciliation can be done subtly. </p><p>It looks to me that you don&#39;t really understand the fundamentals. I suggest spending a lot more time thinking about it and reading articles before jumping into client/server design. There are plenty of good articles about like this one:</p><p><a href="http://www.gamasutra.com/view/feature/3227/designing_fastaction_for_the_.php">http://www.gamasutra.com/view/feature/3227/designing_fastaction_for_the_.php</a></p><p>I would also suggest that you stop dwelling on bandwidth usage.  Compared to latency, bandwidth is a non-issue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Mon, 19 Sep 2011 03:16:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wondered why I kept reading things about 28.8kbps modems... that was written in &#39;97.</p><p>But you say I am wrong go read that page yourself technically speaking that is what I had said earlier.</p><p>&quot;•Schedule events in the future if you want them to happen simultaneously for all users. &quot;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Mon, 19 Sep 2011 03:43:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931519#target">James Lohr</a> said:</div><div class="quote"><p>For example, for an FPS you&#39;ll want the absolute state to be server-side with each client seeing some predictive subset of the state</p></div></div><p>

Does that mean my lagging character might shoot someone even if I&#39;m not really pressing the button?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Mon, 19 Sep 2011 09:26:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931520#target">David Sopala</a> said:</div><div class="quote"><p>But you say I am wrong go read that page yourself technically speaking that is what I had said earlier.</p></div></div><p>

No, this is not what you said. If this is what you were trying to say then you&#39;ve either totally misunderstood it, or you&#39;ve worded it extremely poorly.</p><p>It is referring to individual events. For example, jumping: This can easily be scheduled a short time in the future whilst still feeling responsive by adding a &quot;crouch&quot; period.  So, the user hits the &quot;jump&quot; key, he sees his character start crouching and so it <i>feels</i> to him like there is immediate feedback; however, the message then travels off to the server at which point the server (immediately, or as soon as possible given the network latency!) notifies other clients of the players intention to jump.  The actual lift-off only occurs a short (say 300ms) later than the original player hit his jump key.</p><p>Other players will see the player jump at roughly the same time as the player himself jumps; however, if they look really closely, they might notice that he didn&#39;t crouch at all. </p><p>This is what it is talking about when it says &quot;scheduling events in the future&quot;. A few things to note:  if you try to employ this technique alone to hide all latency, then the game will start to feel clumsy.  So this is just one &quot;trick&quot; in your toolbox of latency hiding techniques. You can&#39;t use it everywhere, and so it <i>should not be a mechanic underlying your entire client/server communication engine</i>, or else you will not have the flexibility to use other techniques.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931541#target">verthex</a> said:</div><div class="quote"><p>Does that mean my lagging character might shoot someone even if I&#39;m not really pressing the button?</p></div></div><p>

No. Go away.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Mon, 19 Sep 2011 13:01:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Haha verthex ^^ I hope you were joking thought :-p
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Mon, 19 Sep 2011 13:02:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931552#target">James Lohr</a> said:</div><div class="quote"><p>It is referring to individual events. For example, jumping: This can easily be scheduled a short time in the future whilst still feeling responsive by adding a &quot;crouch&quot; period.  So, the user hits the &quot;jump&quot; key, he sees his character start crouching and so it feels to him like there is immediate feedback; however, the message then travels off to the server at which point the server (immediately, or as soon as possible given the network latency!) notifies other clients of the players intention to jump.  The actual lift-off only occurs a short (say 300ms) later than the original player hit his jump key.</p></div></div><p>

So you&#39;re saying the server gets the user input, processes it for physics, etc, and then sends the command for jump to every client including the user to jump. It would solve packet loss (somewhat keeping events in order) but 300ms is a lot of time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Mon, 19 Sep 2011 13:57:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>He is still on the 28.8kbps modem mentioned in his other post... 300ms wasn&#39;t all that bad back then...  </p><p>[EDIT]</p><p>I guess by tick he thinks seconds as well.  I usually figure a tick to be around 50ms the wait two ticks is indicitive of It will probably be roughly 100ms+-50ms for a response to the client.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Tue, 20 Sep 2011 02:05:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Everything that article says about latency is as applicable now as it was when the article was written, because guess what, the speed of light hasn&#39;t gotten any faster, and this is what latency ultimately comes down to.</p><p>The 300ms example I gave was a specific case where one wishes to guarantee (or at least ensure a high probability) that a particular event will occur at the same time across all clients.  ~250 ms is roughly the &quot;worst-case&quot; that <i>any</i> good modern multiplayer game will deal with gracefully, even to this day. As I already said, this is just one technique and is probably not even appropriate for jumping. I just gave this example because I hoped that it would be easy for you to understand as comprehension is evidently not your strong point.</p><p>I suggest that you give up now, as you&#39;re clearly not even intelligent enough to be capable of discerning good advice from bad. You really haven&#39;t got a clue what you are doing, and I don&#39;t even know why I&#39;m bothering to post in this thread. I guess it was more out of pity because the primary contributor, other than myself, was verthex who is the #1 bullsh*tter on these forums, and so I felt it my duty give some useful information to counter his &quot;noise&quot;.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Tue, 20 Sep 2011 02:37:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Then please don&#39;t post anymore.  Actually go post at cprogramming.com they are all like you over there - quick to think they are gods and that no one else has any right to be doing anything.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Tue, 20 Sep 2011 06:39:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931598#target">James Lohr</a> said:</div><div class="quote"><p>I suggest that you give up now, as you&#39;re clearly not even intelligent enough to be capable of discerning good advice from bad. You really haven&#39;t got a clue what you are doing, and I don&#39;t even know why I&#39;m bothering to post in this thread. I guess it was more out of pity because the primary contributor, other than myself, was verthex who is the #1 bullsh*tter on these forums, and so I felt it my duty give some useful information to counter his &quot;noise&quot;.
</p></div></div><p>

So you posted a <span class="cuss"><span><span class="cuss"><span><span class="cuss"><span>shit</span></span></span></span>ty</span></span> article and now you know something. What experience do you actually have making client server games and if you&#39;ve never made a FPS please don&#39;t reply. Thats what David is trying to make and so am I.</p><p><a href="https://encrypted.google.com/webhp?complete=0&amp;hl=en#sclient=psy-ab&amp;hl=en&amp;safe=off&amp;complete=0&amp;site=webhp&amp;source=hp&amp;q=syncronizing+client+server&amp;bav=on.2,or.r_gc.r_pw.&amp;fp=30f7c860f7c92f1b&amp;biw=1440&amp;bih=704">Hows</a> this <span class="cuss"><span>bull<span class="cuss"><span>shit</span></span></span></span> when everyones talking about it?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Tue, 20 Sep 2011 11:34:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>David,</p><p>Have you already read the <a href="http://beej.us/guide/bgnet/">Beej&#39;s guide</a> ?<br />It&#39;s full of nice example and perhaps it has evolved since the first time you watched it.</p><p>On Gamasutra and talking about Network, particularly latency hiding, I loved these articles:<br /><a href="http://www.gamasutra.com/view/feature/3230/dead_reckoning_latency_hiding_for_.php">Dead Reckoning: Latency Hiding for Networked Games</a></p><p><a href="http://www.gamedev.net/page/resources/_/reference/programming/multiplayer-and-networking/268/defeating-lag-with-cubic-splines-r914">Defeating-lag-with-cubic-splines</a>, with these two in addition because they somewhat bring a correction/solution to an error in the article: <a href="http://www.gamedev.net/topic/401827-lag-reduction-using-cubic-spline-alias-bezier/">http://www.gamedev.net/topic/401827-lag-reduction-using-cubic-spline-alias-bezier/</a> , <a href="http://en.wikipedia.org/wiki/Cubic_Hermite_spline">http://en.wikipedia.org/wiki/Cubic_Hermite_spline</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 20 Sep 2011 13:06:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931616#target">David Sopala</a> said:</div><div class="quote"><p>Then please don&#39;t post anymore.</p></div></div><p>
Translation:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Guys, when I ask for help I actually don&#39;t want it. Thanks!</p></div></div><p>
 <br />I shall respect your wishes!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Tue, 20 Sep 2011 19:35:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Meh !</p><p><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 20 Sep 2011 21:07:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think you&#39;re both reaching too high. Start with something simpler. Its pretty much the same as trying to make an MMORPG right out of the gate. You will fail. Probably multiple times.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 20 Sep 2011 23:42:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Please note I did have a working MMORPG with items enemies and such - it was all tile based wasn&#39;t very pretty and the classes weren&#39;t written well (that does not mean it didn&#39;t work - it worked fine).  I see no problem making something simple for fun.  You all act like I want to make money or plan to make money with this.  It is just a hobby nothing more nothing less.  I don&#39;t know everything, but judging me saying I&#39;m already going to fail before I even really start to play around.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Wed, 21 Sep 2011 04:32:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s just a very common occurrence. A beginner comes along and says &quot;I want to make an MMORPG&quot; or &quot;I want to make a RPG&quot; or &quot;I want to make an FPS&quot;, and inevitably, they spend more time fighting with the simple issues like timing and bliting, and give up.</p><p>Of course if you go into it not expecting to make the &quot;BEST GAME EVER!&quot;, and know you&#39;re likely to restart several times, that&#39;s ok.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 21 Sep 2011 05:16:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931722#target">David Sopala</a> said:</div><div class="quote"><p>I don&#39;t know everything, but judging me saying I&#39;m already going to fail before I even really start to play around.</p></div></div><p>

The trouble is not that I think you&#39;re taking on an impossible task nor that you are inherently incapable of succeeding, but rather that you don&#39;t seem to have the temperament for it. You came on here asking for advice, but then chose to totally ignore it (and the literature to back it up!) because you took a few of our criticisms personally.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Wed, 21 Sep 2011 12:54:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thus far I&#39;ve used <a href="http://irrlicht.sourceforge.net/forum/viewtopic.php?t=22658">this</a> as my server/client interface for irrlicht.</p><p>I can create clients, display each client as a cube, and allow each client to exit the system without crashing the server as well as ten other things related to basic services. That took me about two weeks to write.</p><p>Its a very easy to use server and I highly recommend it over every other socket oriented library. Its not easy to compile and it took me a few minutes to find the libs for it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (verthex)</author>
		<pubDate>Wed, 21 Sep 2011 21:22:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ah, using a pre-made game engine will certainly make creating a game easier. If creating a game asap is your goal, that is definitely a good option.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Wed, 21 Sep 2011 23:04:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[quote]<br />I suggest that you give up now, as you&#39;re clearly not even intelligent enough to be capable of discerning good advice from bad.  You really haven&#39;t got a clue what you are doing, and I don&#39;t even know why I&#39;m bothering to post in this thread.<br />[/quote]</p><p>No, thats not directed at anyone in particular couldn&#39;t be could it?  So yes I take THAT personally who wouldn&#39;t?  Go away I told you your input is worthless.  You clearly can&#39;t remember what you type from day to day time to go find another thread troll.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Fri, 23 Sep 2011 02:15:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="remote-thumbnail"><span class="json">{"name":"hrzfab.gif","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/3\/5\/3540e6c4f5c1d2cc998e46257e43e30f.gif","w":275,"h":210,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/3\/5\/3540e6c4f5c1d2cc998e46257e43e30f"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/3/5/3540e6c4f5c1d2cc998e46257e43e30f-240.jpg" alt="hrzfab.gif" width="240" height="183" /></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 23 Sep 2011 02:34:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931910#target">David Sopala</a> said:</div><div class="quote"><p>So yes I take THAT personally who wouldn&#39;t?</p></div></div><p>

I don&#39;t deny that I was made a personal attack on you; however, it&#39;s still up to you as to whether or not you let it get to you. </p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>Go away I told you your input is worthless.</p></div></div><p>

To you perhaps, because you&#39;re too blinded by emotion to listen. However other people will read this thread and so I will continue to contribute for their sake.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>go find another thread troll</p></div></div><p>

I&#39;ll take the low-hanging fruit first, thank you. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Fri, 23 Sep 2011 02:37:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wouldn&#39;t want your condescending derogatory help either. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 23 Sep 2011 02:45:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t worry Edgar, <a href="http://www.allegro.cc/forums/thread/607410">helping you</a> is well beyond me. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Fri, 23 Sep 2011 03:04:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>So your definition of help is :<br />1) Insult someone and say they don&#39;t understand what they&#39;re talking about<br />2) When they try to come up with a solution of their own, make sure they feel stupid about it</p><p>I remember the math library thread quite well thank you. You said I didn&#39;t understand how floating point values worked, but I understood it quite well. When I proposed a perfectly valid solution, you called it naive.</p><p>Just how is it that you actually help anyone here anyway?</p><p>With friends like that, who needs enemies?</p><p><img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /><img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 23 Sep 2011 03:08:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931760#target">James Lohr</a> said:</div><div class="quote"><p>
The trouble is not that I think you&#39;re taking on an impossible task nor that you are inherently incapable of succeeding, but rather that you don&#39;t seem to have the temperament for it. You came on here asking for advice, but then chose to totally ignore it (and the literature to back it up!) because you took a few of our criticisms personally. 
</p></div></div><p>

</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931598#target">James Lohr</a> said:</div><div class="quote"><p>
I suggest that you give up now, as you&#39;re clearly not even intelligent enough to be capable of discerning good advice from bad. You really haven&#39;t got a clue what you are doing, and I don&#39;t even know why I&#39;m bothering to post in this thread.
</p></div></div><p>

</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931915#target">James Lohr</a> said:</div><div class="quote"><p>
I don&#39;t deny that I was made a personal attack on you; however, it&#39;s still up to you as to whether or not you let it get to you. 
</p></div></div><p>

You might make a good politician - you play both sides of the fence equally.  </p><p>I have read Beej&#39;s guide to network programming.  I used that and a couple others to write the server side code.  I am up to about 30 files of code at the moment - from characters to items to communications code and collision classes.  I have tested all the commands on the server doing a loopback through an old MUD client of mine to make sure I get the correct responses from the server.  So, yes it isn&#39;t so much will it work it is what problems will I have that need tweeking to make it smoother.  Keep in mind most games back in the 90&#39;s were like warcraft 2 I spent hours playing that back then on KALI and in an AOL chatroom trading IP addresses - also prompted me to upgrade to a 56k modem for like 80 bucks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (David Sopala)</author>
		<pubDate>Fri, 23 Sep 2011 03:33:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/608369/931921#target">Edgar Reynaldo</a> said:</div><div class="quote"><p>So your definition of help is :<br />1) Insult someone and say they don&#39;t understand what they&#39;re talking about<br />2) When they try to come up with a solution of their own, make sure they feel stupid about it</p></div></div><p>

I admit that I was being an unpleasant <span class="cuss"><span>ass</span></span>. I also accept your criticism of my behaviour, and I agree that a consequence is that I&#39;ve not been particularly helpful. </p><p>However, what is not acceptable is to start making totally illogical arguments, especially when they fly in the face of accepted literature on the subject. If you do this, then you make yourself an easy target. </p><p>If we&#39;re all completely honest on what&#39;s going on here then it&#39;s probably something along these lines:</p><p>David has had a good first stab at client-server synchronisation, but is struggling a bit because, if we&#39;re honest, it&#39;s not an easy problem.</p><p>I&#39;d had a bad day, and, partly because I&#39;ve been working on this problem for the past 2 years and now have my own client-server game working smoothly, and partly because I can be an arrogant prick at times, I was rude in my first post.  </p><p>David got offended, quite rightly, but then made the error of criticising the information I was providing rather than my attitude. Illustrating a lack of understanding on the subject.</p><p>I was offended by this, and so said some unpleasant things.</p><p>I think that pretty much sums it up.</p><p>I&#39;m completely unapologetic about the information that I have provided, and I still claim that he will fail to make something that is playable over the internet unless he fully understand what those articles are talking about.</p><p>However, I do apologise for my condescension, arrogance and unpleasantness.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (james_lohr)</author>
		<pubDate>Fri, 23 Sep 2011 04:12:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nice.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 23 Sep 2011 13:52:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Obviously, James Lohr was correct, but it is pointless to tell others negative comments. We don&#39;t know everything, and, at one point in our lives, we were just as knowledgeable as the OP is.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Fri, 23 Sep 2011 16:48:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hell yeah. I remember being hurt as much as David in some of my first answers.</p><p>Anyway, a few smash aren&#39;t bad if in the end all is under control. That&#39;s just the result of burning minds exchanges.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 23 Sep 2011 17:44:00 +0000</pubDate>
	</item>
</rss>
