<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[Networking] ENet Problem</title>
		<link>http://www.allegro.cc/forums/view/586832</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 04 Aug 2006 20:22:18 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have a server application and a client application which, for now, just do a login procedure together. I send 43 bytes worth of login information to the server (20 bytes for a name, 20 bytes for a password, 1 byte for error, state and type). It is in the order of type, name, password, state, error. The server unpacks the packet into the same object that the client uses, validates the information and sends an updated packet with the same structure back to the client. It worked flawlessly until I added validation, additional states and made the errors more specific.<br />For some strange reason the packet does not arrive as the client had sent it. The first 21 (possibly less) bytes are corrupt, but are <i>predictable</i>. The first byte of the first packet starts at 184 and the next packet is always 112. Then the next is 184, and it switches like that constantly. The name (which starts at byte 2) always appears as &#039;`š&#039;. On the client I log the packet immediately before the call to enet_peer_send() like so:
</p><div class="source-code snippet"><div class="inner"><pre>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Send() - Sending packet %p (%u bytes, 1st byte: %u)\n"</span>,_packet,_packet-&gt;dataLength,<span class="k3">*</span><span class="k2">(</span>_packet-&gt;data<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
  enet_peer_send<span class="k2">(</span>peer,<span class="n">0</span>,_packet<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
The packet type of 1 is <i>always</i> logged (which is correct). Like so:
</p><pre>Connection::Send() - Sending packet 01DA6428 (43 bytes, 1st byte: 1)</pre><p>
Similarly, on the server, I check the first byte of the packet before I do anything else with it:
</p><div class="source-code snippet"><div class="inner"><pre>        <span class="k1">switch</span> <span class="k2">(</span>e.type<span class="k2">)</span>
        <span class="k2">{</span>
    <span class="k1">case</span> ENET_EVENT_TYPE_RECEIVE:
      <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"A packet of length %u was received from %s. The first byte is : %u\n"</span>,
        e.packet <span class="k3">-</span><span class="k3">&gt;</span> dataLength,ipStr,<span class="k3">*</span><span class="k2">(</span>e.packet-&gt;data<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
        <span class="c">// ...</span>
</pre></div></div><p>
But the server logs a different type!
</p><pre>A packet of length 43 was received from 206.186.35.60. The first byte is : 184</pre><p>

Gah!!<br />I&#039;m pulling my hair out <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /></p><p>There is a lot of code in total, but here is the main server code, which I <b>think</b> is where the problem is:
</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 &lt;allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;winalleg.h&gt;</span>
<span class="number">   3</span><span class="p">#include "server.h"</span>
<span class="number">   4</span><span class="p">#include "networkcontrol.h"</span>
<span class="number">   5</span>
<span class="number">   6</span>Server::Server<span class="k2">(</span><span class="k2">)</span>
<span class="number">   7</span><span class="k2">{</span>
<span class="number">   8</span>    <span class="k1">if</span> <span class="k2">(</span>enet_initialize <span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">   9</span>    <span class="k2">{</span>
<span class="number">  10</span>        <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Error initializing enet.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  11</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number">  12</span>    <span class="k2">}</span>
<span class="number">  13</span>
<span class="number">  14</span>    <span class="c">/* Bind the server to the default localhost.     */</span>
<span class="number">  15</span>    address.host <span class="k3">=</span> ENET_HOST_ANY<span class="k2">;</span>
<span class="number">  16</span>    <span class="c">/* Bind the server to port 4000. */</span>
<span class="number">  17</span>    address.port <span class="k3">=</span> <span class="n">4000</span><span class="k2">;</span>
<span class="number">  18</span>
<span class="number">  19</span>    server <span class="k3">=</span> enet_host_create <span class="k2">(</span><span class="k3">&amp;</span> address,<span class="n">32</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>  <span class="k1">if</span><span class="k2">(</span>server <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number">  21</span>  <span class="k2">{</span>
<span class="number">  22</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Unable to create host object!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  23</span>  <span class="k2">}</span>
<span class="number">  24</span>  <span class="k1">else</span>
<span class="number">  25</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Successfully initialized enet server.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span><span class="k2">}</span>
<span class="number">  27</span>
<span class="number">  28</span><span class="k1">void</span> Server::Listen<span class="k2">(</span><span class="k2">)</span>
<span class="number">  29</span><span class="k2">{</span>
<span class="number">  30</span>  ENetEvent e<span class="k2">;</span>
<span class="number">  31</span>  <span class="k1">unsigned</span> <span class="k1">char</span> packet_type <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  32</span>  <span class="k1">char</span> ipStr<span class="k2">[</span><span class="n">20</span><span class="k2">]</span><span class="k3">=</span><span class="s">""</span><span class="k2">;</span>
<span class="number">  33</span>  Player <span class="k3">*</span>_player<span class="k2">;</span>
<span class="number">  34</span>    
<span class="number">  35</span>    <span class="k1">while</span> <span class="k2">(</span>enet_host_service <span class="k2">(</span>server, <span class="k3">&amp;</span> e, <span class="n">0</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  36</span>    <span class="k2">{</span>
<span class="number">  37</span>    IpToStr<span class="k2">(</span>ipStr,e.peer-&gt;address.host<span class="k2">)</span><span class="k2">;</span>
<span class="number">  38</span>        <span class="k1">switch</span> <span class="k2">(</span>e.type<span class="k2">)</span>
<span class="number">  39</span>        <span class="k2">{</span>
<span class="number">  40</span>        <span class="k1">case</span> ENET_EVENT_TYPE_CONNECT:
<span class="number">  41</span>            <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"A new client connected from %s:%u.\n"</span>, 
<span class="number">  42</span>          ipStr,
<span class="number">  43</span>                    e.peer <span class="k3">-</span><span class="k3">&gt;</span> address.port<span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>      
<span class="number">  45</span>      <span class="c">// add the player to the list.</span>
<span class="number">  46</span>      _player <span class="k3">=</span> <span class="k1">new</span> Player<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  47</span>      _player-&gt;SetState<span class="k2">(</span>SERVER_PLAYERSTATE_LOBBY<span class="k2">)</span><span class="k2">;</span>  <span class="c">// the player is in the lobby and not yet logging in</span>
<span class="number">  48</span>      _player-&gt;c <span class="k3">=</span> <span class="k1">new</span> Connection<span class="k2">(</span>e.peer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>      players.push_back<span class="k2">(</span>_player<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  51</span>    <span class="k1">case</span> ENET_EVENT_TYPE_RECEIVE:
<span class="number">  52</span>      <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"A packet of length %u was received from %s. The first byte is : %u\n"</span>,
<span class="number">  53</span>        e.packet <span class="k3">-</span><span class="k3">&gt;</span> dataLength,ipStr,<span class="k3">*</span><span class="k2">(</span>e.packet-&gt;data<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>
<span class="number">  55</span>      <span class="c">// get the player who sent it</span>
<span class="number">  56</span>      std::list <span class="k3">&lt;</span>Player <span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator i<span class="k2">;</span>
<span class="number">  57</span>      <span class="k1">for</span><span class="k2">(</span>i <span class="k3">=</span> players.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">!</span><span class="k3">=</span>players.end<span class="k2">(</span><span class="k2">)</span><span class="k3">&amp;</span><span class="k3">&amp;</span><span class="k3">!</span>players.empty<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  58</span>      <span class="k2">{</span>
<span class="number">  59</span>        <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span><span class="k3">*</span>i<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>c-&gt;peer <span class="k3">=</span><span class="k3">=</span> e.peer<span class="k2">)</span>
<span class="number">  60</span>        <span class="k2">{</span>
<span class="number">  61</span>          _player <span class="k3">=</span> <span class="k3">*</span>i<span class="k2">;</span>
<span class="number">  62</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number">  63</span>        <span class="k2">}</span>
<span class="number">  64</span>      <span class="k2">}</span>
<span class="number">  65</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_player<span class="k2">)</span>
<span class="number">  66</span>      <span class="k2">{</span>
<span class="number">  67</span>        <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Error: Peer is not attached to a player object. Discarding packet.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number">  69</span>      <span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span>      <span class="c">// get the type of packet</span>
<span class="number">  72</span>      packet_type <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>e.packet-&gt;data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</span>      <span class="k1">switch</span><span class="k2">(</span>packet_type<span class="k2">)</span>
<span class="number">  75</span>      <span class="k2">{</span>
<span class="number">  76</span>      <span class="k1">case</span> NC_LOGIN:
<span class="number">  77</span>        <span class="k2">{</span>
<span class="number">  78</span>          <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_player-&gt;loginControl<span class="k2">)</span> _player-&gt;loginControl <span class="k3">=</span> <span class="k1">new</span> LoginControl<span class="k2">(</span><span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>          _player-&gt;loginControl-&gt;Unpack<span class="k2">(</span>e.packet<span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>          <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Player Login [%s|%s] %s|%i\n"</span>,_player-&gt;loginControl-&gt;name,_player-&gt;loginControl-&gt;passwd,ipStr,_player-&gt;loginControl-&gt;state<span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>          
<span class="number">  82</span>          <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_player-&gt;loginControl-&gt;Validate<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  83</span>          <span class="k2">{</span>
<span class="number">  84</span>            <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN FAILED! Unable to validate user (error code %i).\n"</span>,_player-&gt;loginControl-&gt;err<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>          <span class="k2">}</span>
<span class="number">  86</span>          <span class="c">// send result back</span>
<span class="number">  87</span>          _player-&gt;loginControl-&gt;Pack<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  
<span class="number">  88</span>          _player-&gt;loginControl-&gt;Synchronize<span class="k2">(</span>_player-&gt;c<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>          
<span class="number">  90</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number">  91</span>        <span class="k2">}</span>
<span class="number">  92</span>      default:
<span class="number">  93</span>        <span class="k2">{</span>
<span class="number">  94</span>          <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_player-&gt;loginControl<span class="k2">)</span> _player-&gt;loginControl <span class="k3">=</span> <span class="k1">new</span> LoginControl<span class="k2">(</span><span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>          _player-&gt;loginControl-&gt;Unpack<span class="k2">(</span>e.packet<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>          <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Player Login [%s|%s] %s|%i\n"</span>,_player-&gt;loginControl-&gt;name,_player-&gt;loginControl-&gt;passwd,ipStr,_player-&gt;loginControl-&gt;state<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>          
<span class="number">  98</span>          <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_player-&gt;loginControl-&gt;Validate<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  99</span>          <span class="k2">{</span>
<span class="number"> 100</span>            <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN FAILED! Unable to validate user (error code %i).\n"</span>,_player-&gt;loginControl-&gt;err<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>          <span class="k2">}</span>
<span class="number"> 102</span>          <span class="c">// send result back</span>
<span class="number"> 103</span>          _player-&gt;loginControl-&gt;Pack<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 104</span>          _player-&gt;loginControl-&gt;Synchronize<span class="k2">(</span>_player-&gt;c<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>          
<span class="number"> 106</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 107</span>          <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Packet type unknown. Discarded (%u).\n"</span>,packet_type<span class="k2">)</span><span class="k2">;</span>  
<span class="number"> 108</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 109</span>        <span class="k2">}</span>
<span class="number"> 110</span>      <span class="k2">}</span>
<span class="number"> 111</span>
<span class="number"> 112</span>            <span class="c">/* Clean up the packet now that we're done using it. */</span>
<span class="number"> 113</span>            enet_packet_destroy <span class="k2">(</span>e.packet<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 115</span>        <span class="k2">}</span>
<span class="number"> 116</span>    <span class="k2">}</span>
<span class="number"> 117</span><span class="k2">}</span>
<span class="number"> 118</span>
<span class="number"> 119</span><span class="k1">int</span> Server::Update<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 120</span><span class="k2">{</span>
<span class="number"> 121</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 122</span><span class="k2">}</span>
<span class="number"> 123</span>
<span class="number"> 124</span><span class="k1">volatile</span> <span class="k1">int</span> kill_server <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 125</span>
<span class="number"> 126</span><span class="k1">void</span> KillServer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number"> 127</span><span class="k2">{</span>
<span class="number"> 128</span>  kill_server <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 129</span><span class="k2">}</span>
<span class="number"> 130</span><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>KillServer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>
<span class="number"> 132</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 133</span><span class="k2">{</span>
<span class="number"> 134</span>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>  <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>
<span class="number"> 138</span>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>KillServer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>  <a href="http://www.allegro.cc/manual/set_close_button_callback" target="_blank"><span class="a">set_close_button_callback</span></a><span class="k2">(</span>KillServer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>
<span class="number"> 141</span>  Server <span class="k3">*</span>server <span class="k3">=</span> <span class="k1">new</span> Server<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>
<span class="number"> 143</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>kill_server<span class="k2">)</span>
<span class="number"> 144</span>  <span class="k2">{</span>
<span class="number"> 145</span>    server-&gt;Listen<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>    <span class="k1">while</span><span class="k2">(</span>server-&gt;Update<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>    <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>  <span class="k2">}</span>
<span class="number"> 149</span>
<span class="number"> 150</span>  <span class="k1">delete</span> server<span class="k2">;</span>
<span class="number"> 151</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 152</span><span class="k2">}</span>
<span class="number"> 153</span><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>
Here is the connection.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 &lt;allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;winalleg.h&gt;</span>
<span class="number">   3</span><span class="p">#include "connection.h"</span>
<span class="number">   4</span><span class="p">#include "DataBank.h"</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="p">#define PORT_NUM  4000</span>
<span class="number">   7</span>
<span class="number">   8</span>Connection::Connection<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>_host<span class="k2">)</span>
<span class="number">   9</span><span class="k2">{</span>
<span class="number">  10</span>  peer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  11</span>  client <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  12</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>Connect<span class="k2">(</span>_host<span class="k2">)</span><span class="k2">)</span>
<span class="number">  13</span>  <span class="k2">{</span>
<span class="number">  14</span>    <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"Error: Unable to connect to Modia server."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  15</span>    peer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  16</span>    client <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  17</span>  <span class="k2">}</span>
<span class="number">  18</span><span class="k2">}</span>
<span class="number">  19</span>
<span class="number">  20</span>Connection::Connection<span class="k2">(</span>ENetPeer <span class="k3">*</span>_peer<span class="k2">)</span>
<span class="number">  21</span><span class="k2">{</span>
<span class="number">  22</span>  peer <span class="k3">=</span> _peer<span class="k2">;</span>
<span class="number">  23</span>  client <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  24</span><span class="k2">}</span>
<span class="number">  25</span>
<span class="number">  26</span><span class="k1">void</span> Connection::Send<span class="k2">(</span>ENetPacket <span class="k3">*</span>_packet<span class="k2">)</span>
<span class="number">  27</span><span class="k2">{</span>
<span class="number">  28</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>peer<span class="k2">)</span> 
<span class="number">  29</span>  <span class="k2">{</span>
<span class="number">  30</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Send() - Invalid peer.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number">  32</span>  <span class="k2">}</span>
<span class="number">  33</span>  
<span class="number">  34</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>_packet<span class="k2">)</span>
<span class="number">  35</span>  <span class="k2">{</span>
<span class="number">  36</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Send() - Invalid packet.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  37</span>    <span class="k1">return</span><span class="k2">;</span>
<span class="number">  38</span>  <span class="k2">}</span>
<span class="number">  39</span>  
<span class="number">  40</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Send() - Sending packet %p (%u bytes, 1st byte: %u)\n"</span>,_packet,_packet-&gt;dataLength,<span class="k3">*</span><span class="k2">(</span>_packet-&gt;data<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span>  enet_peer_send<span class="k2">(</span>peer,<span class="n">0</span>,_packet<span class="k2">)</span><span class="k2">;</span>
<span class="number">  42</span><span class="k2">}</span>
<span class="number">  43</span>
<span class="number">  44</span><span class="k1">int</span> Connection::Update<span class="k2">(</span><span class="k2">)</span>
<span class="number">  45</span><span class="k2">{</span>
<span class="number">  46</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>peer<span class="k2">)</span> <span class="k2">{</span> <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Update() - Unable to update connection. No peer.\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  47</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>client<span class="k2">)</span> <span class="k2">{</span> <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connection::Update() - Unable to update connection. No client object.\n"</span><span class="k2">)</span><span class="k2">;</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span> <span class="k2">}</span>
<span class="number">  48</span>  ENetEvent e<span class="k2">;</span>
<span class="number">  49</span>  <span class="k1">char</span> ipStr<span class="k2">[</span><span class="n">20</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  50</span>  <span class="k1">unsigned</span> <span class="k1">char</span> packet_type <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  51</span>    
<span class="number">  52</span>    <span class="k1">while</span> <span class="k2">(</span>enet_host_service <span class="k2">(</span>client, <span class="k3">&amp;</span>e, <span class="n">0</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  53</span>    <span class="k2">{</span>
<span class="number">  54</span>    IpToStr<span class="k2">(</span>ipStr,e.peer-&gt;address.host<span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>        <span class="k1">switch</span> <span class="k2">(</span>e.type<span class="k2">)</span>
<span class="number">  56</span>        <span class="k2">{</span>
<span class="number">  57</span>    <span class="k1">case</span> ENET_EVENT_TYPE_RECEIVE:
<span class="number">  58</span>      <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"A packet of length %u was received from %s.\n"</span>,
<span class="number">  59</span>        e.packet <span class="k3">-</span><span class="k3">&gt;</span> dataLength,ipStr<span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>
<span class="number">  61</span>      <span class="c">// get the type of packet</span>
<span class="number">  62</span>      packet_type <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>e.packet-&gt;data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>      <span class="k1">switch</span><span class="k2">(</span>packet_type<span class="k2">)</span>
<span class="number">  65</span>      <span class="k2">{</span>
<span class="number">  66</span>      <span class="k1">case</span> NC_LOGIN:
<span class="number">  67</span>        <span class="k2">{</span>
<span class="number">  68</span>          <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>DataBank::player-&gt;loginControl<span class="k2">)</span>
<span class="number">  69</span>          <span class="k2">{</span>
<span class="number">  70</span>            <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Error: No login control associated with player.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>            <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Login packet discarded."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  73</span>          <span class="k2">}</span>
<span class="number">  74</span>          DataBank::player-&gt;loginControl-&gt;Unpack<span class="k2">(</span>e.packet<span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>          <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Unpacked login data. (%s, %s, %i, %i)\n"</span>,DataBank::player-&gt;loginControl-&gt;name,DataBank::player-&gt;loginControl-&gt;passwd,DataBank::player-&gt;loginControl-&gt;state,DataBank::player-&gt;loginControl-&gt;err<span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number">  77</span>        <span class="k2">}</span>
<span class="number">  78</span>      default:
<span class="number">  79</span>        <span class="k2">{</span>
<span class="number">  80</span>          <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Packet type unknown. Discarded.\n"</span><span class="k2">)</span><span class="k2">;</span>  
<span class="number">  81</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number">  82</span>        <span class="k2">}</span>
<span class="number">  83</span>      <span class="k2">}</span>
<span class="number">  84</span>
<span class="number">  85</span>            <span class="c">/* Clean up the packet now that we're done using it. */</span>
<span class="number">  86</span>            enet_packet_destroy <span class="k2">(</span>e.packet<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number">  88</span>        <span class="k2">}</span>
<span class="number">  89</span>    <span class="k2">}</span>
<span class="number">  90</span>
<span class="number">  91</span>  <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  92</span><span class="k2">}</span>
<span class="number">  93</span>
<span class="number">  94</span><span class="k1">int</span> Connection::Connect<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>_host<span class="k2">)</span>
<span class="number">  95</span><span class="k2">{</span>
<span class="number">  96</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Connecting to host %s..."</span>,_host<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>    enet_address_set_host <span class="k2">(</span><span class="k3">&amp;</span> address, _host<span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>    address.port <span class="k3">=</span> PORT_NUM<span class="k2">;</span>
<span class="number">  99</span>
<span class="number"> 100</span>  ENetEvent e<span class="k2">;</span>
<span class="number"> 101</span>    <span class="c">/* Initiate the connection, allocating the two channels 0 and 1. */</span>
<span class="number"> 102</span>  client <span class="k3">=</span> enet_host_create <span class="k2">(</span>NULL,<span class="n">1</span>,<span class="n">5</span>,<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>    peer <span class="k3">=</span> enet_host_connect<span class="k2">(</span>client, <span class="k3">&amp;</span> address, <span class="n">2</span><span class="k2">)</span><span class="k2">;</span>    
<span class="number"> 104</span>    
<span class="number"> 105</span>    <span class="k1">if</span> <span class="k2">(</span>peer <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 106</span>    <span class="k2">{</span>
<span class="number"> 107</span>       <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"FAILED.\nCould not find host.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 108</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 109</span>    <span class="k2">}</span>
<span class="number"> 110</span>    
<span class="number"> 111</span>    <span class="c">/* Wait up to 5 seconds for the connection attempt to succeed. */</span>
<span class="number"> 112</span>    <span class="k1">if</span> <span class="k2">(</span>enet_host_service <span class="k2">(</span>client, <span class="k3">&amp;</span>e, <span class="n">5000</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span>
<span class="number"> 113</span>        e.type <span class="k3">=</span><span class="k3">=</span> ENET_EVENT_TYPE_CONNECT<span class="k2">)</span>
<span class="number"> 114</span>    <span class="k2">{</span>
<span class="number"> 115</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Succeeded.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 116</span>    <span class="k2">}</span>
<span class="number"> 117</span>    <span class="k1">else</span>
<span class="number"> 118</span>    <span class="k2">{</span>
<span class="number"> 119</span>        <span class="c">/* Either the 5 seconds are up or a disconnect event was */</span>
<span class="number"> 120</span>        <span class="c">/* received. Reset the peer in the event the 5 seconds   */</span>
<span class="number"> 121</span>        <span class="c">/* had run out without any significant event.            */</span>
<span class="number"> 122</span>        enet_peer_reset <span class="k2">(</span>peer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>    peer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 124</span>
<span class="number"> 125</span>        <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"FAILED. Connection reset by peer (TIMEOUT).\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 127</span>    <span class="k2">}</span>
<span class="number"> 128</span>  <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 129</span><span class="k2">}</span>
<span class="number"> 130</span>
<span class="number"> 131</span>Connection::~Connection<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 132</span><span class="k2">{</span>
<span class="number"> 133</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Disconnecting from host..."</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>
<span class="number"> 135</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"OK.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span><span class="k2">}</span>
</div></div><p>
If necessary, the logincontrol.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 &lt;allegro.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;winalleg.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;string.h&gt;</span>
<span class="number">   4</span><span class="p">#include "player.h"</span>
<span class="number">   5</span><span class="p">#include "NetworkControl.h"</span>
<span class="number">   6</span>
<span class="number">   7</span>LoginControl::LoginControl<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>_name,<span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>_passwd<span class="k2">)</span>
<span class="number">   8</span><span class="k2">{</span>
<span class="number">   9</span>  type <span class="k3">=</span> NC_LOGIN<span class="k2">;</span>  <span class="c">// set the type of the command</span>
<span class="number">  10</span>  packet_out <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  11</span>  <span class="k1">if</span><span class="k2">(</span>_name <span class="k3">&amp;</span><span class="k3">&amp;</span> _passwd<span class="k2">)</span>
<span class="number">  12</span>  <span class="k2">{</span>
<span class="number">  13</span>    <span class="k1">if</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>_name<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">20</span><span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number">  14</span>    <span class="k1">if</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>_passwd<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">20</span><span class="k2">)</span> <span class="k1">return</span><span class="k2">;</span>
<span class="number">  15</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>name,_name<span class="k2">)</span><span class="k2">;</span>
<span class="number">  16</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_756.html" target="_blank">strcpy</a><span class="k2">(</span>passwd,_passwd<span class="k2">)</span><span class="k2">;</span>
<span class="number">  17</span>  <span class="k2">}</span>
<span class="number">  18</span>  state <span class="k3">=</span> LOGIN_STATE_WAIT<span class="k2">;</span>
<span class="number">  19</span>  err <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  20</span>  c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  21</span>  size <span class="k3">=</span> <span class="n">43</span><span class="k2">;</span> <span class="c">// name + passwd + state(1) + err(1) + type(1)</span>
<span class="number">  22</span><span class="k2">}</span>
<span class="number">  23</span>
<span class="number">  24</span>ENetPacket <span class="k3">*</span>LoginControl::Pack<span class="k2">(</span><span class="k2">)</span>
<span class="number">  25</span><span class="k2">{</span>
<span class="number">  26</span>  <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>buffer <span class="k3">=</span> <span class="k1">new</span> <span class="k1">unsigned</span> <span class="k1">char</span><span class="k2">[</span>size<span class="k3">+</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  27</span>  <span class="k1">if</span><span class="k2">(</span>packet_out<span class="k2">)</span> 
<span class="number">  28</span>  <span class="k2">{</span>
<span class="number">  29</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LoginControl::Pack() - Warning. packet_out exists! overwriting packet.\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>    enet_packet_destroy<span class="k2">(</span>packet_out<span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>    packet_out <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  32</span>  <span class="k2">}</span>
<span class="number">  33</span>
<span class="number">  34</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>buffer<span class="k2">)</span> <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  35</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>buffer,<span class="s">'\0'</span>,size<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  36</span>
<span class="number">  37</span>  <span class="k1">if</span><span class="k2">(</span>state <span class="k3">&gt;</span> <span class="n">3</span><span class="k2">)</span> state <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  38</span>
<span class="number">  39</span>  <span class="c">// pack everything into the buffer</span>
<span class="number">  40</span>  <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>ptr <span class="k3">=</span> buffer<span class="k2">;</span>
<span class="number">  41</span>  <span class="k3">*</span><span class="k2">(</span>ptr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k3">=</span> type<span class="k2">;</span>
<span class="number">  42</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>ptr,name,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// name[20]</span>
<span class="number">  43</span>  ptr <span class="k3">+</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>  
<span class="number">  44</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>ptr,passwd,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// passwd[20]</span>
<span class="number">  45</span>  ptr <span class="k3">+</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>
<span class="number">  46</span>  <span class="k3">*</span>ptr <span class="k3">=</span> state<span class="k2">;</span>
<span class="number">  47</span>  <span class="k3">*</span><span class="k2">(</span><span class="k3">+</span><span class="k3">+</span>ptr<span class="k2">)</span> <span class="k3">=</span> err<span class="k2">;</span>
<span class="number">  48</span>
<span class="number">  49</span>  packet_out <span class="k3">=</span> enet_packet_create<span class="k2">(</span>buffer,size,ENET_PACKET_FLAG_RELIABLE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  50</span>
<span class="number">  51</span>  <span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> buffer<span class="k2">;</span>
<span class="number">  52</span>  <span class="k1">return</span> packet_out<span class="k2">;</span>
<span class="number">  53</span><span class="k2">}</span>
<span class="number">  54</span>
<span class="number">  55</span><span class="k1">int</span> LoginControl::Unpack<span class="k2">(</span>ENetPacket <span class="k3">*</span>_packet<span class="k2">)</span>
<span class="number">  56</span><span class="k2">{</span>
<span class="number">  57</span>  <span class="k1">if</span><span class="k2">(</span>_packet-&gt;dataLength <span class="k3">!</span><span class="k3">=</span> size<span class="k2">)</span>
<span class="number">  58</span>  <span class="k2">{</span>
<span class="number">  59</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LoginControl :: NETWORK ERROR! Data packet size invalid!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>    err <span class="k3">=</span> LOGIN_ERR_BADPACKET<span class="k2">;</span>  <span class="c">// wrong data length</span>
<span class="number">  61</span>    state <span class="k3">=</span> LOGIN_STATE_WAIT<span class="k2">;</span>  <span class="c">// set state back to beginning.</span>
<span class="number">  62</span>
<span class="number">  63</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  64</span>  <span class="k2">}</span>
<span class="number">  65</span>
<span class="number">  66</span>  <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>ptr <span class="k3">=</span> _packet-&gt;data<span class="k2">;</span>
<span class="number">  67</span>  type <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>ptr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>name,ptr,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>  ptr <span class="k3">+</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>
<span class="number">  70</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span>passwd,ptr,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>  ptr <span class="k3">+</span><span class="k3">=</span> <span class="n">20</span><span class="k2">;</span>
<span class="number">  72</span>  state <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>ptr<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>  err <span class="k3">=</span> <span class="k3">*</span>ptr<span class="k2">;</span>
<span class="number">  74</span>
<span class="number">  75</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LoginControl packet has been unpacked. {Type: %i Err: %i State: %i}\n"</span>,type,err,state<span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>  
<span class="number">  77</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  78</span><span class="k2">}</span>
<span class="number">  79</span>
<span class="number">  80</span><span class="k1">int</span> LoginControl::Validate<span class="k2">(</span><span class="k2">)</span>
<span class="number">  81</span><span class="k2">{</span>
<span class="number">  82</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Validating user %s pass %s..."</span>,name,passwd<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>  <span class="c">// check if the username / password meets minimum criteria</span>
<span class="number">  84</span>  <span class="k1">if</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>name<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">3</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>name<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">12</span><span class="k2">)</span>
<span class="number">  85</span>  <span class="k2">{</span>
<span class="number">  86</span>    SetState<span class="k2">(</span>LOGIN_STATE_FAILED<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>    err <span class="k3">=</span> LOGIN_ERR_WRONGLENGTH<span class="k2">;</span>
<span class="number">  88</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN_ERR_WRONGLENGTH\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>    <span class="k1">return</span> <span class="n">0</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><a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>passwd<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">3</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_764.html" target="_blank">strlen</a><span class="k2">(</span>passwd<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">19</span><span class="k2">)</span>
<span class="number">  92</span>  <span class="k2">{</span>
<span class="number">  93</span>    SetState<span class="k2">(</span>LOGIN_STATE_FAILED<span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>    err <span class="k3">=</span> LOGIN_ERR_WRONGLENGTH<span class="k2">;</span>
<span class="number">  95</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN_ERR_WRONGLENGTH\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  97</span>  <span class="k2">}</span>
<span class="number">  98</span>
<span class="number">  99</span>  <span class="k1">char</span> fbuf<span class="k2">[</span><span class="n">255</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 100</span>  _snprintf<span class="k2">(</span>fbuf,<span class="n">255</span>,<span class="s">"players/%c/%s"</span>,name<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>,name<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/exists" target="_blank"><span class="a">exists</span></a><span class="k2">(</span>fbuf<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 102</span>  <span class="k2">{</span>
<span class="number"> 103</span>    <span class="c">// player not found</span>
<span class="number"> 104</span>    err <span class="k3">=</span> LOGIN_ERR_BADNAME<span class="k2">;</span>
<span class="number"> 105</span>    SetState<span class="k2">(</span>LOGIN_STATE_FAILED<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN_ERR_BADNAME\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 108</span>  <span class="k2">}</span>
<span class="number"> 109</span>
<span class="number"> 110</span>  Player <span class="k3">*</span>player <span class="k3">=</span> <span class="k1">new</span> Player<span class="k2">(</span>fbuf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span>  <span class="k1">if</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>player-&gt;passwd,passwd<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 112</span>  <span class="k2">{</span>
<span class="number"> 113</span>    err <span class="k3">=</span> LOGIN_ERR_BADPASSWD<span class="k2">;</span>
<span class="number"> 114</span>    SetState<span class="k2">(</span>LOGIN_STATE_FAILED<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>    <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"LOGIN_ERR_BADPASSWD\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 116</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 117</span>  <span class="k2">}</span>
<span class="number"> 118</span>
<span class="number"> 119</span>  <a href="http://www.allegro.cc/manual/TRACE" target="_blank"><span class="a">TRACE</span></a><span class="k2">(</span><span class="s">"Success\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>  SetState<span class="k2">(</span>LOGIN_STATE_SUCCESS<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>
<span class="number"> 122</span>  <span class="k1">return</span> state<span class="k2">;</span>
<span class="number"> 123</span><span class="k2">}</span>
</div></div><p>

Any help is appeciated. I have no idea what happened, it&#039;s been like this for about 3 coding sessions without any progress &gt;&lt;</p><p><b>Update</b><br />The client has the same problem when receiving from the server. The first byte interchanges between 88 and 168 every other packet <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Derezo)</author>
		<pubDate>Fri, 04 Aug 2006 05:29:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would stop using the library.</p><p>Does the library contain any example files ?<br />Do they work ?<br />Have you tried hacking them apart and using them ?</p><p>Are you using a library for a reason ?<br />DIY TCP/IP isn&#39;t that hard, unless this library offers you features you want, i&#39;d stop using it.</p><p>Is this library stable?   or even complete?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Fri, 04 Aug 2006 09:45:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Oh my. It&#39;s almost as if someone had warned earlier that enet was a bad idea...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Fri, 04 Aug 2006 09:50:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, like all good newbs, let&#39;s blame the library! I&#39;ve had no problems with enet, but I don&#39;t enjoy picking through someone else&#39;s C++, so I really cannot offer any advice. Plus, Speedhack is almost upon us...</p><p>Sounds to me like you are corrupting the memory somehow with the recent changes you made.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Fri, 04 Aug 2006 10:38:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Did you recompile everything after you made changes?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (miran)</author>
		<pubDate>Fri, 04 Aug 2006 10:48:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just some general advice - it&#39;s not a good idea to use a UDP-based library if you want to process all your packets reliably and in order. Sure, some libraries may offer some <i>slight</i> advantages over TCP in the way they implement that, but with  UDP you also have to worry about things like NAT punch-through, especially with all the varying implementations of NAT that seem to be found on routers.</p><p>I would suggest using whatever asynchronous I/O is offered by the target OS (assuming Windows from looking at the code) or even better, a platform-independent abstraction of asynchronous TCP/IP.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve++)</author>
		<pubDate>Fri, 04 Aug 2006 11:19:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, I tried a clean make. No luck <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I don&#39;t enjoy picking through someone else&#39;s C++
</p></div></div><p>Me either, and my code is especially spaghetti-like <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> I&#39;m just at a total loss as to what is causing this problem. It APPEARS that I&#39;m corrupting something, but that doesn&#39;t make sense. I am examining it going out and outputting the results, they are fine. But coming back in, on a separate application, the packet is damaged and <i>half</i> corrupted. That doesn&#39;t make any sense! <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" /><br />The changes that I did make were relatively simplistic. The biggest changes were made by the addition of the Verify function on the login control... which doesn&#39;t even have any actual networking code in it. <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" />
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Oh my. It&#39;s almost as if someone had warned earlier that enet was a bad idea...
</p></div></div><p>I thought of that after I had came across this problem. &quot;Maybe X-G was right and enet isn&#39;t as simple as it seems.&quot;, but it was working so great on Friday, before I added user verification.<br />Right now I am thinking that it is enet&#39;s fault, but nothing makes any sense really. The networking code was hardly changed at all which is what really makes it strange.<br />If I can&#39;t solve this problem by next saturday I&#39;ll likely be switching libraries.. but none of the others are quite as simple as enet, that&#39;s the only problem <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /> Plain old sockets didn&#39;t work very well for my MUD engine. They did <i>work</i>, but I needed some sort of optimization. When a lot of users connected (a lot is 5 or more, heh) latency would drastically increase. <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /></p><p>Now to answer AJ&#39;s <i>questions</i>:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Does the library contain any example files ?
</p></div></div><p>Yes. <a href="http://enet.cubik.org/">Google is your friend</a>.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Do they work ?
</p></div></div><p>Yes.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Have you tried hacking them apart and using them ?
</p></div></div><p>Yes.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Are you using a library for a reason ?
</p></div></div><p>Yes.
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
DIY TCP/IP isn&#39;t that hard, unless this library offers you features you want, i&#39;d stop using it.
</p></div></div><p>I&#39;ve used sockets directly (if that&#39;s what you mean by do-it-yourself TCP/IP), out of the box they do not have very many features. I wouldn&#39;t recommend it, really. If you&#39;re new to networking it is a good learning experience, though.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Is this library stable?
</p></div></div><p>As far as I can tell, yes. Numerous other projects have used this library. However, I am a little new to enet and have no prior experience with it.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
or even complete?
</p></div></div><p>You can visit their <a href="http://enet.cubik.org/">website</a> and decide for yourself. Personally, it is as complete as I need it to be. You may need more features or a higher level library, but if you&#39;re looking for a networking library please create a new thread or use the search feature. It&#39;s been asked many times, so you should be able to find some results worth viewing.<br />[edit]
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
it&#39;s not a good idea to use a UDP-based library if you want to process all your packets reliably and in order.
</p></div></div><p>ENet claims to have <a href="http://enet.cubik.org/Features.html">reliable and sequenced</a> packets. I&#39;ve set the appropriate values for reliable packets. The problem is elsewhere.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Derezo)</author>
		<pubDate>Fri, 04 Aug 2006 11:37:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>if you&#39;ve testing the entry and exit points of the library and the data is getting corrupted within, its the library at fault.</p><p>unless your passing invalid length data..<br />when you pass the length of the data to send, what are you passing ?<br />is it derived from a strlen() or a fixed packet size?</p><p>-&gt;Unpack()  -&gt;Pack()  what are these ?     they seem like something that will modify your data
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Fri, 04 Aug 2006 12:23:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
if you&#39;ve testing the entry and exit points of the library and the data is getting corrupted within, its the library at fault.
</p></div></div><p>The problem is that I made changes to cause this problem... I should have kept better records of what exactly I changed <img src="http://www.allegro.cc/forums/smileys/sad.gif" alt=":(" /><br />The problem <i>appears</i> to be with enet, but because it was working fine <i>before</i> I find it hard to accept that.</p><p>The size of the data is 43 bytes (on both ends). It is fixed. Pack() creates an ENet Packet from the data and Unpack() takes an ENet Packet and turns it into useable data. I did have trace calls at every step of the pack/unpack process and it did not show anything different. Unpack() is called <i>after</i> the problem is evident and Pack() is called just before sending the packet which does not show the problem happening.</p><p>Oh well. SpeedHack time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Derezo)</author>
		<pubDate>Fri, 04 Aug 2006 20:07:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I searched the <a href="http://lists.cubik.org/mailman/listinfo/enet-discuss">mailing list</a> archive, but I couldn&#39;t find anyone else complaing about a data corruption problem. Let&#39;s not forget that Enet adds information (most likely at the beginning) to packets such as sequence and channel numbers. I don&#39;t know anything about Enet, but I&#39;ve got a hunch this has something to do with that.</p><p>Try reducing your code to the smallest code that will reproduce the error you&#39;re experiencing.</p><p>Also try the Enet mailing list.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve++)</author>
		<pubDate>Fri, 04 Aug 2006 20:22:18 +0000</pubDate>
	</item>
</rss>
