<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>WinSock 2 Asynchronous</title>
		<link>http://www.allegro.cc/forums/view/594471</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 26 Dec 2007 15:01:37 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m learning network programming using WinSock 2 based on a tutorial on GameDev.net</p><p><a href="http://www.gamedev.net/reference/articles/article1059.asp">http://www.gamedev.net/reference/articles/article1059.asp</a></p><p>Currently, I&#39;m just trying to create a <b>simple console program</b> (no window!). I want the server to be able to do stuff like send some strings to the clients and responds when a client disconnected. But I couldn&#39;t get this line to work (I&#39;m really new to this) :</p><p><span class="source-code">WSAAsyncSelect <span class="k2">(</span>s, hWnd, WM_ONSOCKET, <span class="k2">(</span>FD_READ <span class="k3">|</span> FD_CONNECT <span class="k3">|</span> FD_CLOSE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></span></p><p>I don&#39;t know where the second parameter came from... <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" /> Here&#39;s my current source codes of the client and the server (no asynchronous socket yet) :</p><p>CLIENT
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="p">#define WM_SOCKET WM_USER+1</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>    </td></tr><tr><td class="number">12</td><td>    WSADATA w<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>,<span class="k3">&amp;</span>w<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">15</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  You need WinSock 2.2!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">if</span> <span class="k2">(</span>w.wVersion<span class="k3">!</span><span class="k3">=</span><span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Wrong WinSock version!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>  </td></tr><tr><td class="number">26</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"WinSock Version 2.2 Initialized\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  </td></tr><tr><td class="number">28</td><td>  SOCKET s <span class="k3">=</span> socket<span class="k2">(</span>AF_INET,SOCK_STREAM,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  sockaddr_in target<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>    target.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span>          </td></tr><tr><td class="number">32</td><td>    target.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a> <span class="k2">(</span><span class="n">5555</span><span class="k2">)</span><span class="k2">;</span>       </td></tr><tr><td class="number">33</td><td>    target.sin_addr.s_addr <span class="k3">=</span> inet_addr <span class="k2">(</span><span class="s">"127.0.0.1"</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">34</td><td>    </td></tr><tr><td class="number">35</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Connecting...\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    </td></tr><tr><td class="number">37</td><td>    <span class="k1">if</span> <span class="k2">(</span>connect<span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>target, <span class="k1">sizeof</span><span class="k2">(</span>target<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">38</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">39</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error in connection!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>  closesocket <span class="k2">(</span>s<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Connected!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>  </td></tr><tr><td class="number">46</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">47</td><td>                </td></tr><tr><td class="number">48</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">49</td><td>&#160;</td></tr><tr><td class="number">50</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

SERVER
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="p">#define MAX_CLIENTS 5</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>    </td></tr><tr><td class="number">10</td><td>    WSADATA w<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>,<span class="k3">&amp;</span>w<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">13</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  You need WinSock 2.2!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">if</span> <span class="k2">(</span>w.wVersion<span class="k3">!</span><span class="k3">=</span><span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Wrong WinSock version!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>  </td></tr><tr><td class="number">24</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"WinSock Version 2.2 Initialized\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  </td></tr><tr><td class="number">26</td><td>  SOCKET s <span class="k3">=</span> socket<span class="k2">(</span>AF_INET,SOCK_STREAM,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  sockaddr_in addr<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>  addr.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  addr.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a> <span class="k2">(</span><span class="n">5555</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  addr.sin_addr.s_addr <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_464.html" target="_blank">htonl</a> <span class="k2">(</span>INADDR_ANY<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>  </td></tr><tr><td class="number">33</td><td>  <span class="k1">if</span> <span class="k2">(</span>bind<span class="k2">(</span>s,<span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>addr,<span class="k1">sizeof</span><span class="k2">(</span>addr<span class="k2">)</span><span class="k2">)</span><span class="k3">=</span><span class="k3">=</span>SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">34</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Unable to bind socket!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Socket binded\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>  </td></tr><tr><td class="number">41</td><td>  <span class="k1">if</span> <span class="k2">(</span>listen<span class="k2">(</span>s,MAX_CLIENTS<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span>SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">42</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">43</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Unable to listen!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">47</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Listening for connections...\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>  </td></tr><tr><td class="number">49</td><td>  <span class="k1">int</span> number_of_clients <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    SOCKET client<span class="k2">[</span>MAX_CLIENTS<span class="k2">]</span><span class="k2">;</span>      </td></tr><tr><td class="number">51</td><td>    sockaddr client_sock<span class="k2">[</span>MAX_CLIENTS<span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">52</td><td>    <span class="k1">int</span> addr_size <span class="k3">=</span> <span class="k1">sizeof</span><span class="k2">(</span>sockaddr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    <span class="k1">char</span> buffer<span class="k2">[</span><span class="n">255</span><span class="k2">]</span><span class="k2">;</span> </td></tr><tr><td class="number">54</td><td>  </td></tr><tr><td class="number">55</td><td>  <span class="k1">while</span> <span class="k2">(</span>number_of_clients <span class="k3">&lt;</span> MAX_CLIENTS<span class="k2">)</span></td></tr><tr><td class="number">56</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">57</td><td>      client<span class="k2">[</span>number_of_clients<span class="k2">]</span> <span class="k3">=</span> accept <span class="k2">(</span>s, <span class="k3">&amp;</span>client_sock<span class="k2">[</span>number_of_clients<span class="k2">]</span>, <span class="k3">&amp;</span>addr_size<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>      </td></tr><tr><td class="number">59</td><td>      <span class="k1">if</span> <span class="k2">(</span>client<span class="k2">[</span>number_of_clients<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> INVALID_SOCKET<span class="k2">)</span></td></tr><tr><td class="number">60</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Unable to accept connection!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>        WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">65</td><td>      </td></tr><tr><td class="number">66</td><td>      <span class="k1">else</span></td></tr><tr><td class="number">67</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>        number_of_clients<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Connection accepted!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">71</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">72</td><td>    </td></tr><tr><td class="number">73</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Enough Clients!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>  closesocket <span class="k2">(</span>s<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>  </td></tr><tr><td class="number">76</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">77</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">78</td><td>&#160;</td></tr><tr><td class="number">79</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Fri, 21 Dec 2007 17:45:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It seems like you&#39;re quite new to this; MSDN is your friend:<br /><a href="http://msdn2.microsoft.com/en-us/library/ms741540.aspx">MSDN for WSAAsyncSelect</a></p><p>It seems like the second argument is for a window handle. Have you done windows programming at all? If not, this is gonna be a brick wall for you. I don&#39;t know if you need this line, truly. I assume you&#39;re using it so that the call to connect or accept will not be blocking (ie: it will not hang). For this you&#39;ll get to enter a magical new world: THREADS!</p><p>A thread is like another process running within your main process. In the linux world you can create a thread via the fork() function. In the Windows world, however, you have a whole nother barrel of monkeys to open to use threads. For this you&#39;ll want to look into the <a href="http://msdn2.microsoft.com/en-us/library/ms682453.aspx">CreateThread Function</a>. Just to get you started, you should note that most of the parameters to this function will be useless to you until you start getting into higher levels of threads. For now, the most important parameters are lpStartAddress (the function you want the thread to run; in other words- the main function of your thread), lpParameter (the parameter that you want to pass to the main function of your thread), and lpThreadID which is only important if you need to close your thread from within your main process.</p><p>For a great, MS filled example look <a href="http://msdn2.microsoft.com/en-us/library/ms682516(VS.85).aspx">here</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Sat, 22 Dec 2007 02:00:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the links! Looks like I have to learn Windows Programming first <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Sat, 22 Dec 2007 05:09:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Synapse Jumps,  you make out like Windows Threads are harder than linux threads.</p><p>I use a single function to make thread.  with 3 parameteres, 1 is 0, the other is a pointer to your own function, and one is the start function.   Thats it!<br />Could it get any simplier?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (aj5555)</author>
		<pubDate>Sat, 22 Dec 2007 12:03:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, I&#39;ve found a tutorial on Windows Programming and learned a bit about the basics. The client is now using asynchronous socket. But I&#39;m facing this problem right now. The client is able to connect to the server (I detected it using FD_CONNECT by prompting a message box) but as soon as I clicked the &quot;OK&quot; button on the message box, another message box saying &quot;Unable to connect!&quot; pops up. The second message box came from an error checking to check whether the client is able to connect to the server:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span>connect <span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>target, <span class="k1">sizeof</span><span class="k2">(</span>target<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
    <span class="k2">{</span>      
        MessageBox<span class="k2">(</span>NULL, <span class="s">"Unable to connect!"</span>, <span class="s">"Error!"</span>,
            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span>
        WSACleanup <span class="k2">(</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>
</pre></div></div><p>

What&#39;s the problem here? And why I can&#39;t connect in the first place? I didn&#39;t face this problem when I wrote a simple client program (without asynchronous socket).</p><p>CLIENT
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;windows.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="p">#define WM_ONSOCKET WM_USER+1</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">const</span> <span class="k1">char</span> g_szClassName<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="s">"myWindowClass"</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>LRESULT CALLBACK WndProc<span class="k2">(</span>HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam<span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">switch</span><span class="k2">(</span>msg<span class="k2">)</span></td></tr><tr><td class="number">13</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">14</td><td>        </td></tr><tr><td class="number">15</td><td>        <span class="k1">case</span> WM_ONSOCKET:</td></tr><tr><td class="number">16</td><td>        <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>            <span class="k1">if</span> <span class="k2">(</span>WSAGETSELECTERROR<span class="k2">(</span>lParam<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">18</td><td>            <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>              WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>              <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>            <span class="k1">switch</span> <span class="k2">(</span>WSAGETSELECTEVENT<span class="k2">(</span>lParam<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td>            <span class="k2">{</span></td></tr><tr><td class="number">24</td><td>                <span class="k1">case</span> FD_CONNECT <span class="k2">:</span> <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>                  MessageBox<span class="k2">(</span>NULL, <span class="s">"Connected!"</span>, <span class="s">"Yay!"</span>, MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>                <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">28</td><td>        <span class="k2">}</span> <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>        </td></tr><tr><td class="number">30</td><td>        <span class="k1">case</span> WM_CLOSE:</td></tr><tr><td class="number">31</td><td>            DestroyWindow<span class="k2">(</span>hwnd<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>        <span class="k1">case</span> WM_DESTROY:</td></tr><tr><td class="number">34</td><td>            PostQuitMessage<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>        default:</td></tr><tr><td class="number">37</td><td>            <span class="k1">return</span> DefWindowProc<span class="k2">(</span>hwnd, msg, wParam, lParam<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td><span class="k2">}</span></td></tr><tr><td class="number">41</td><td>&#160;</td></tr><tr><td class="number">42</td><td><span class="k1">int</span> WINAPI WinMain<span class="k2">(</span>HINSTANCE hInstance, HINSTANCE hPrevInstance,</td></tr><tr><td class="number">43</td><td>    LPSTR lpCmdLine, <span class="k1">int</span> nCmdShow<span class="k2">)</span></td></tr><tr><td class="number">44</td><td><span class="k2">{</span></td></tr><tr><td class="number">45</td><td>    WNDCLASSEX wc<span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    HWND hwnd<span class="k2">;</span></td></tr><tr><td class="number">47</td><td>    MSG Msg<span class="k2">;</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>    wc.cbSize        <span class="k3">=</span> <span class="k1">sizeof</span><span class="k2">(</span>WNDCLASSEX<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    wc.style         <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>    wc.lpfnWndProc   <span class="k3">=</span> WndProc<span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    wc.cbClsExtra    <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    wc.cbWndExtra    <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>    wc.hInstance     <span class="k3">=</span> hInstance<span class="k2">;</span></td></tr><tr><td class="number">55</td><td>    wc.hIcon         <span class="k3">=</span> LoadIcon<span class="k2">(</span>NULL, IDI_APPLICATION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>    wc.hCursor       <span class="k3">=</span> LoadCursor<span class="k2">(</span>NULL, IDC_ARROW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>    wc.hbrBackground <span class="k3">=</span> <span class="k2">(</span>HBRUSH<span class="k2">)</span><span class="k2">(</span>COLOR_WINDOW<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>    wc.lpszMenuName  <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>    wc.lpszClassName <span class="k3">=</span> g_szClassName<span class="k2">;</span></td></tr><tr><td class="number">60</td><td>    wc.hIconSm       <span class="k3">=</span> LoadIcon<span class="k2">(</span>NULL, IDI_APPLICATION<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>RegisterClassEx<span class="k2">(</span><span class="k3">&amp;</span>wc<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">63</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">64</td><td>        MessageBox<span class="k2">(</span>NULL, <span class="s">"Window Registration Failed!"</span>, <span class="s">"Error!"</span>,</td></tr><tr><td class="number">65</td><td>            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">68</td><td>&#160;</td></tr><tr><td class="number">69</td><td>    hwnd <span class="k3">=</span> CreateWindowEx<span class="k2">(</span></td></tr><tr><td class="number">70</td><td>        WS_EX_CLIENTEDGE,</td></tr><tr><td class="number">71</td><td>        g_szClassName,</td></tr><tr><td class="number">72</td><td>        <span class="s">"The title of my window"</span>,</td></tr><tr><td class="number">73</td><td>        WS_OVERLAPPEDWINDOW,</td></tr><tr><td class="number">74</td><td>        CW_USEDEFAULT, CW_USEDEFAULT, <span class="n">240</span>, <span class="n">120</span>,</td></tr><tr><td class="number">75</td><td>        NULL, NULL, hInstance, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>&#160;</td></tr><tr><td class="number">77</td><td>    <span class="k1">if</span><span class="k2">(</span>hwnd <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span></td></tr><tr><td class="number">78</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">79</td><td>        MessageBox<span class="k2">(</span>NULL, <span class="s">"Window Creation Failed!"</span>, <span class="s">"Error!"</span>,</td></tr><tr><td class="number">80</td><td>            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">83</td><td>&#160;</td></tr><tr><td class="number">84</td><td>    ShowWindow<span class="k2">(</span>hwnd, nCmdShow<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>    UpdateWindow<span class="k2">(</span>hwnd<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>    </td></tr><tr><td class="number">87</td><td>    WSADATA w<span class="k2">;</span>  </td></tr><tr><td class="number">88</td><td>    </td></tr><tr><td class="number">89</td><td>    <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>, <span class="k3">&amp;</span>w<span class="k2">)</span><span class="k2">;</span>   </td></tr><tr><td class="number">90</td><td>    </td></tr><tr><td class="number">91</td><td>    <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">92</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">93</td><td>      MessageBox<span class="k2">(</span>NULL, <span class="s">"Failed to initialize WinSock!"</span>, <span class="s">"Error!"</span>,</td></tr><tr><td class="number">94</td><td>            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">95</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">97</td><td>    <span class="k1">if</span> <span class="k2">(</span>w.wVersion <span class="k3">!</span><span class="k3">=</span> <span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">98</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">99</td><td>      MessageBox<span class="k2">(</span>NULL, <span class="s">"Wrong version of WinSock!"</span>, <span class="s">"Error!"</span>,</td></tr><tr><td class="number">100</td><td>            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">102</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">104</td><td>    </td></tr><tr><td class="number">105</td><td>    SOCKET s <span class="k3">=</span> socket <span class="k2">(</span>AF_INET, SOCK_STREAM, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">106</td><td>    sockaddr_in target<span class="k2">;</span></td></tr><tr><td class="number">107</td><td>    </td></tr><tr><td class="number">108</td><td>    target.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span>          </td></tr><tr><td class="number">109</td><td>    target.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a> <span class="k2">(</span><span class="n">5001</span><span class="k2">)</span><span class="k2">;</span>        </td></tr><tr><td class="number">110</td><td>    target.sin_addr.s_addr <span class="k3">=</span> inet_addr <span class="k2">(</span><span class="s">"127.0.0.1"</span><span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">111</td><td>    </td></tr><tr><td class="number">112</td><td>    WSAAsyncSelect <span class="k2">(</span>s, hwnd, WM_ONSOCKET, <span class="k2">(</span>FD_READ <span class="k3">|</span> FD_CONNECT <span class="k3">|</span> FD_CLOSE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">113</td><td>    </td></tr><tr><td class="number">114</td><td>    <span class="k1">if</span> <span class="k2">(</span>connect <span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>target, <span class="k1">sizeof</span><span class="k2">(</span>target<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">115</td><td>    <span class="k2">{</span>      </td></tr><tr><td class="number">116</td><td>        MessageBox<span class="k2">(</span>NULL, <span class="s">"Unable to connect!"</span>, <span class="s">"Error!"</span>,</td></tr><tr><td class="number">117</td><td>            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">118</td><td>        WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">119</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">121</td><td>&#160;</td></tr><tr><td class="number">122</td><td>    <span class="k1">while</span><span class="k2">(</span>GetMessage<span class="k2">(</span><span class="k3">&amp;</span>Msg, NULL, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">123</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">124</td><td>        TranslateMessage<span class="k2">(</span><span class="k3">&amp;</span>Msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">125</td><td>        DispatchMessage<span class="k2">(</span><span class="k3">&amp;</span>Msg<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">126</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">127</td><td>    </td></tr><tr><td class="number">128</td><td>    closesocket <span class="k2">(</span>s<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">129</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">130</td><td>    </td></tr><tr><td class="number">131</td><td>    <span class="k1">return</span> Msg.wParam<span class="k2">;</span></td></tr><tr><td class="number">132</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

SERVER
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="p">#define MAX_CLIENTS   3</span></td></tr><tr><td class="number">6</td><td><span class="k1">const</span> <span class="k1">int</span> socket_port <span class="k3">=</span> <span class="n">5001</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td><span class="k1">int</span> client_num <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="k1">int</span> addr_size <span class="k3">=</span> <span class="k1">sizeof</span> <span class="k2">(</span>sockaddr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">int</span> main <span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    WSADATA w<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>, <span class="k3">&amp;</span>w<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">15</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Unable to initialize WinSock.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>    <span class="k1">if</span> <span class="k2">(</span>w.wVersion <span class="k3">!</span><span class="k3">=</span> <span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">21</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Wrong version of WinSock.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">25</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"WinSock 2 initialized.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    </td></tr><tr><td class="number">27</td><td>    SOCKET s <span class="k3">=</span> socket <span class="k2">(</span>AF_INET, SOCK_STREAM, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    sockaddr_in addr<span class="k2">;</span> </td></tr><tr><td class="number">29</td><td>    addr.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span>     </td></tr><tr><td class="number">30</td><td>    addr.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a> <span class="k2">(</span>socket_port<span class="k2">)</span><span class="k2">;</span>   </td></tr><tr><td class="number">31</td><td>    addr.sin_addr.s_addr <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_464.html" target="_blank">htonl</a> <span class="k2">(</span>INADDR_ANY<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">32</td><td>    <span class="k1">if</span> <span class="k2">(</span>bind<span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>addr, <span class="k1">sizeof</span><span class="k2">(</span>addr<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">33</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">34</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Cannot bind to port %d.\n"</span>, socket_port<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">36</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>       </td></tr><tr><td class="number">37</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">38</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Socket binded to port %d.\n"</span>, socket_port<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    </td></tr><tr><td class="number">40</td><td>    <span class="k1">if</span> <span class="k2">(</span>listen <span class="k2">(</span>s,MAX_CLIENTS<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">41</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">42</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Unable to listen to port %d.\n"</span>, socket_port<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">46</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Listening for connections at port %d....\n"</span>, socket_port<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>    </td></tr><tr><td class="number">48</td><td>    SOCKET client<span class="k2">[</span>MAX_CLIENTS<span class="k2">]</span><span class="k2">;</span>       </td></tr><tr><td class="number">49</td><td>    sockaddr client_sock<span class="k2">[</span>MAX_CLIENTS<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    </td></tr><tr><td class="number">51</td><td>    <span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">52</td><td>                </td></tr><tr><td class="number">53</td><td>      <span class="k1">while</span> <span class="k2">(</span>client_num<span class="k3">&lt;</span>MAX_CLIENTS<span class="k2">)</span></td></tr><tr><td class="number">54</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>        client<span class="k2">[</span>client_num<span class="k2">]</span> <span class="k3">=</span> accept <span class="k2">(</span>s, <span class="k3">&amp;</span>client_sock<span class="k2">[</span>client_num<span class="k2">]</span>, <span class="k3">&amp;</span>addr_size<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>        <span class="k1">if</span> <span class="k2">(</span>client<span class="k2">[</span>client_num<span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> INVALID_SOCKET<span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"Unable to accept connection.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">62</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">63</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">64</td><td>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a> <span class="k2">(</span><span class="s">"A client has connected to the server.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>            client_num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">67</td><td>      <span class="k2">}</span>                   </td></tr><tr><td class="number">68</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">69</td><td>    </td></tr><tr><td class="number">70</td><td>    closesocket <span class="k2">(</span>s<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td>    </td></tr><tr><td class="number">73</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Sun, 23 Dec 2007 05:36:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Using threads is overkill.  All the packet processing is done behind your back anyway.  All your application is doing is reading memory...</p><p>Using threads for networking is like using an oversized truck to move a harddrive.  Silly and a total waste of gas.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Sun, 23 Dec 2007 08:11:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>aj: Well... pretty much everything in Windows is complicated. I mean, if you&#39;ve never done any Windows programming before, anything is bound to be hard, especially something as deeply abstract and complicated as threads. Linux threads are just as abstract and complicated, but I feel their implementation just makes more sense. <b>shrugs</b> To each his own?</p><p>Dustin: Oh please. If he wants to learn how to do network programming he damn sure well better know how to use threads. Maybe he doesn&#39;t need them just yet, but its a really useful tool to have in your &#39;programming arsenal.&#39; I mean, unless you just want to serve one client forever, or only wait for those blocking accept calls to serve more than one client.</p><p>Fish: I think you&#39;re thinking about this a little backwards. Usually servers are the heavily asynchronous sides of the networked world. They both listen for incoming connections and serve information to their clients. Their trick is that they often accept and serve several clients simultaneously- a feat nearly impossible without the helping hands of threads. What you&#39;re trying to do here really doesn&#39;t require asynchronous activity. I suppose I should apologize for leading you astray with threads, but, as mentioned above: they&#39;re terribly useful and a great thing to know about. </p><p>Anyways, I think I&#39;vefigured out why you&#39;re getting this strange error. Check out the <a href="http://msdn2.microsoft.com/en-us/library/ms737625.aspx">MSDN on connect</a>. Specifically the part about the return values:
</p><div class="quote_container"><div class="title">MSDN said:</div><div class="quote"><p>
On a blocking socket, the return value indicates success or failure of the connection attempt.</p><p>With a nonblocking socket, the connection attempt cannot be completed immediately. In this case, connect will return SOCKET_ERROR, and WSAGetLastError will return WSAEWOULDBLOCK. In this case, there are three possible scenarios...
</p></div></div><p>
As you can see, your socket is nonblocking, and therefore will force a return of SOCKET_ERROR. Not that  you really have an error, just that you can&#39;t connect at just that moment. Get it? You&#39;re on the right track, though, for sure.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Sun, 23 Dec 2007 15:08:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t really get what you&#39;re saying but the problem was solved when I changed the arrangement of the codes :</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">if</span> <span class="k2">(</span>connect <span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>target, <span class="k1">sizeof</span><span class="k2">(</span>target<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
    <span class="k2">{</span>      
        MessageBox<span class="k2">(</span>NULL, <span class="s">"Unable to connect!"</span>, <span class="s">"Error!"</span>,
            MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK<span class="k2">)</span><span class="k2">;</span>
        WSACleanup <span class="k2">(</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>

WSAAsyncSelect <span class="k2">(</span>s, hwnd, WM_ONSOCKET, <span class="k2">(</span>FD_READ <span class="k3">|</span> FD_CONNECT <span class="k3">|</span> FD_CLOSE<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Sun, 23 Dec 2007 17:41:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Well... pretty much everything in Windows is complicated.
</p></div></div><p>

No its not.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I mean, if you&#39;ve never done any Windows programming before, anything is bound to be hard
</p></div></div><p>

If you&#39;ve never done any Windows programming, its bound to be <b>UNKNOWN</b>, it might be easy, it might be hard.  Is everything new to you difficult?  Have you a learning disability?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
especially something as deeply abstract and complicated as threads.
</p></div></div><p>
what is so complicated about one very simple idea..  instead of having one piece of code running, you have several.  What is so hard to comprehend about that?<br />Complicated?    There is only 1 rule for threads. &quot;lock shared memory&quot;  its not rocket surgery.  <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (aj5555)</author>
		<pubDate>Sun, 23 Dec 2007 18:54:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fishcake: Ya, that would fix the problem. When your sockets are blocking, ie: synchronous, if you ask them to connect, they&#39;ll keep trying to connect untl it happens or times out, without halting to let ANYTHING else in your program happen. When your sockets are asynchronous, ie: nonblocking, if you ask them to connect, they will immediately return a value of SOCKET_ERROR so as to not continue blocking your programs execution. They will, however, connect, simply in the background where they don&#39;t have to keep your code from executing. This is most likely accomplished via some sort of thread or seperate Windows process.</p><p>aj: Damn, dude. Lets argue semantics a little more, shall we? Yes, new things are generally more difficult for me to grasp than things that I currently have a good understanding of. Damn this learning disability of mine!
</p><div class="quote_container"><div class="title">the false AJ said:</div><div class="quote"><p>
what is so complicated about one very simple idea.. instead of having one piece of code running, you have several. What is so hard to comprehend about that?<br />Complicated? There is only 1 rule for threads. &quot;lock shared memory&quot; its not rocket surgery.
</p></div></div><p>
Right. That&#39;s all there is to threads. You don&#39;t need to specify a stack size for them, nor do you need to free their memories. Opening and closing several threads at run-time, that&#39;s not important, or complicated! Just two pieces of code running, right? An operating system is just several pieces of code running at once; what&#39;s so hard about that? When do we get AJOS? Will the information provided be in sentence fragments and structured as grammatical nightmares? Honestly, writing is simple: just put letters together and punctuate it correctly. Is everything simple for mankind difficult for you? Really, its not rocket science.</p><p>PS: Speaking of rockets, please preform surgery on a rocket. We&#39;re seriously lacking in Darwin Awards on Allegro.cc
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Mon, 24 Dec 2007 03:29:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Following Beej&#39;s Guide to Network Programming, I was able to turn the server into non-blocking using the <tt>select()</tt> function.</p><p>How do I use <tt>select()</tt> to turn the client into non-blocking ( without using <tt>WSAAsyncSelect()</tt> ) so that <tt>send()</tt> and <tt>recv()</tt> do not block? Or should I just stick to <tt>WSAAsyncSelect()</tt>? (I hate using WINAPI with allegro <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Mon, 24 Dec 2007 14:45:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Umm... If you&#39;ve got the server you should be able to get the client. You just have to check in your main loop if the socket is ready to recieve stuff... Is send even blocking? Anyways this is pseudocode for it:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;stdlib.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;fcntl.h&gt;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td><span class="k2">{</span></td></tr><tr><td class="number">8</td><td>    </td></tr><tr><td class="number">9</td><td>    WSADATA w<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>,<span class="k3">&amp;</span>w<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">12</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  You need WinSock 2.2!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">if</span> <span class="k2">(</span>w.wVersion<span class="k3">!</span><span class="k3">=</span><span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error:  Wrong WinSock version!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">22</td><td>  </td></tr><tr><td class="number">23</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"WinSock Version 2.2 Initialized\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  </td></tr><tr><td class="number">25</td><td>  SOCKET s <span class="k3">=</span> socket<span class="k2">(</span>AF_INET,SOCK_STREAM,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_309.html" target="_blank">fcntl</a><span class="k2">(</span>s, F_SETFL, O_NONBLOCK<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  sockaddr_in target<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>&#160;</td></tr><tr><td class="number">29</td><td>    target.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span>          </td></tr><tr><td class="number">30</td><td>    target.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a> <span class="k2">(</span><span class="n">5555</span><span class="k2">)</span><span class="k2">;</span>       </td></tr><tr><td class="number">31</td><td>    target.sin_addr.s_addr <span class="k3">=</span> inet_addr <span class="k2">(</span><span class="s">"127.0.0.1"</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">32</td><td>    </td></tr><tr><td class="number">33</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Connecting...\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    </td></tr><tr><td class="number">35</td><td>    <span class="k1">if</span> <span class="k2">(</span>connect<span class="k2">(</span>s, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>target, <span class="k1">sizeof</span><span class="k2">(</span>target<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">36</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">37</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Error in connection!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">41</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Connected!\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  </td></tr><tr><td class="number">43</td><td>    fd_set readfds, writefds<span class="k2">;</span></td></tr><tr><td class="number">44</td><td>    FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>readfds<span class="k2">)</span><span class="k2">;</span> FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>writefds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    FD_SET<span class="k2">(</span>s, <span class="k3">&amp;</span>readfds<span class="k2">)</span><span class="k2">;</span> FD_SET<span class="k2">(</span>s, <span class="k3">&amp;</span>writefds<span class="k2">)</span><span class="k2">;</span>   <span class="c">//add our socket to the two sets sets we'll send to select</span></td></tr><tr><td class="number">46</td><td>    <span class="k1">struct</span> timeval tv<span class="k2">;</span></td></tr><tr><td class="number">47</td><td>    tv.tv_sec <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> tv.tv_usec <span class="k3">=</span> <span class="n">50</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">50</td><td>       <a href="http://www.delorie.com/djgpp/doc/libc/libc_688.html" target="_blank">select</a><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>s<span class="k3">+</span><span class="n">1</span>, <span class="k3">&amp;</span>readfds, <span class="k3">&amp;</span>writefds, NULL, <span class="k3">&amp;</span>tv<span class="k2">)</span><span class="k2">;</span>  <span class="c">//check if the socket  can be read/written</span></td></tr><tr><td class="number">51</td><td>        </td></tr><tr><td class="number">52</td><td>        <span class="k1">if</span> <span class="k2">(</span>FD_ISSET<span class="k2">(</span>s, <span class="k3">&amp;</span>readfds<span class="k2">)</span><span class="k2">)</span>                      <span class="c">//the socket is ready to recieve</span></td></tr><tr><td class="number">53</td><td>            recv<span class="k2">(</span>stuff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>FD_ISSET<span class="k2">(</span>s, <span class="k3">&amp;</span>writefds<span class="k2">)</span><span class="k2">)</span>              <span class="c">//the socket is ready to write stuff.... but it should always be...</span></td></tr><tr><td class="number">55</td><td>            send<span class="k2">(</span>stuff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">57</td><td>&#160;</td></tr><tr><td class="number">58</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Tue, 25 Dec 2007 04:49:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><a href="http://www.delorie.com/djgpp/doc/libc/libc_309.html" target="_blank">fcntl</a><span class="k2">(</span>s, F_SETFL, O_NONBLOCK<span class="k2">)</span><span class="k2">;</span></span></p><p>I have problem with this line. I have included <tt>fcntl.h</tt>, but F_SETFL and O_NONBLOCK are not defined <img src="http://www.allegro.cc/forums/smileys/embarassed.gif" alt=":-[" />. Oh wait, even the function itself is not defined.<br />When I commented the line out, the main loop ran but <tt>recv()</tt> was not called. And then I tried changing the last parameter of <tt>select()</tt> to NULL. <tt>recv()</tt> still blocks.</p><p>------------------------------------------------------------------------------------</p><p>About my server, I want to allow only 2 clients to connect. If an extra client tries to connect, the server will not accept it. But if one or more connected client disconnected, the server will accept connections again. How do I do that? Currently, it accepts every connection. Here&#39;s the source code :</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;winsock2.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="p">#define                  PORT               8000</span></td></tr><tr><td class="number">5</td><td><span class="p">#define                  MAX_CLIENTS        2</span></td></tr><tr><td class="number">6</td><td><span class="k1">int</span>                      client_num         <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>WSADATA                  wsadata<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>fd_set                   master<span class="k2">;</span>   </td></tr><tr><td class="number">9</td><td>fd_set                   read_fds<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>sockaddr_in              myaddr<span class="k2">;</span>    </td></tr><tr><td class="number">11</td><td>sockaddr_in              remoteaddr<span class="k2">;</span></td></tr><tr><td class="number">12</td><td><span class="k1">int</span>                      fdmax<span class="k2">;</span>        </td></tr><tr><td class="number">13</td><td>SOCKET                   listener<span class="k2">;</span>     </td></tr><tr><td class="number">14</td><td><span class="k1">int</span>                      newfd<span class="k2">;</span>        </td></tr><tr><td class="number">15</td><td><span class="k1">char</span>                     buf<span class="k2">[</span><span class="n">256</span><span class="k2">]</span><span class="k2">;</span>    </td></tr><tr><td class="number">16</td><td><span class="k1">int</span>                      nbytes<span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k1">int</span>                      yes                <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>        </td></tr><tr><td class="number">18</td><td><span class="k1">int</span>                      addrlen            <span class="k3">=</span> <span class="k1">sizeof</span><span class="k2">(</span>remoteaddr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td><span class="k1">int</span>                      i<span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k1">int</span>                      j<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">23</td><td><span class="k2">{</span></td></tr><tr><td class="number">24</td><td>    </td></tr><tr><td class="number">25</td><td>    <span class="k1">int</span> error <span class="k3">=</span> WSAStartup <span class="k2">(</span><span class="n">0x0202</span>, <span class="k3">&amp;</span>wsadata<span class="k2">)</span><span class="k2">;</span>   </td></tr><tr><td class="number">26</td><td>    </td></tr><tr><td class="number">27</td><td>    <span class="k1">if</span> <span class="k2">(</span>error<span class="k2">)</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">29</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unable to initialize WinSock.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">32</td><td>    <span class="k1">if</span> <span class="k2">(</span>wsadata.wVersion <span class="k3">!</span><span class="k3">=</span> <span class="n">0x0202</span><span class="k2">)</span></td></tr><tr><td class="number">33</td><td>    <span class="k2">{</span> </td></tr><tr><td class="number">34</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Wrong version of WinSock.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">36</td><td>      <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">38</td><td>    </td></tr><tr><td class="number">39</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"WinSock initialized.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>    FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>master<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">42</td><td>    FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>read_fds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>listener <span class="k3">=</span> socket<span class="k2">(</span>AF_INET, SOCK_STREAM, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">45</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unable to create socket.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>        WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">49</td><td>    </td></tr><tr><td class="number">50</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Listener socket created.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>   </td></tr><tr><td class="number">52</td><td>    port_input:</td></tr><tr><td class="number">53</td><td>    <span class="k1">int</span> myport<span class="k2">;</span></td></tr><tr><td class="number">54</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"Enter a port number : "</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_670.html" target="_blank">scanf</a><span class="k2">(</span> <span class="s">"%d"</span>, <span class="k3">&amp;</span>myport <span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">56</td><td>    <span class="k1">if</span><span class="k2">(</span> myport <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span> <span class="s">"Invalid port number.\n"</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>        <span class="k1">goto</span> port_input<span class="k2">;</span></td></tr><tr><td class="number">60</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">61</td><td>&#160;</td></tr><tr><td class="number">62</td><td>    myaddr.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span></td></tr><tr><td class="number">63</td><td>    myaddr.sin_port <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_465.html" target="_blank">htons</a><span class="k2">(</span>myport<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>    myaddr.sin_addr.s_addr <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_464.html" target="_blank">htonl</a><span class="k2">(</span>INADDR_ANY<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>myaddr.sin_zero, <span class="s">'\0'</span>, <span class="k1">sizeof</span> myaddr.sin_zero<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    </td></tr><tr><td class="number">67</td><td>    <span class="k1">if</span> <span class="k2">(</span>bind<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>myaddr, <span class="k1">sizeof</span><span class="k2">(</span>myaddr<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unable to bind to port %d.\n"</span>, myport<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>        WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">72</td><td>    </td></tr><tr><td class="number">73</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Listener socket binded to port %d.\n"</span>, myport<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td>    <span class="k1">if</span> <span class="k2">(</span>listen<span class="k2">(</span>listener, MAX_CLIENTS<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">76</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unable to listen.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">77</td><td>        WSACleanup <span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">80</td><td>&#160;</td></tr><tr><td class="number">81</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Listening for connections....\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">82</td><td>&#160;</td></tr><tr><td class="number">83</td><td>    FD_SET<span class="k2">(</span>listener, <span class="k3">&amp;</span>master<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">84</td><td>    fdmax <span class="k3">=</span> listener<span class="k2">;</span> </td></tr><tr><td class="number">85</td><td>&#160;</td></tr><tr><td class="number">86</td><td>    <span class="k1">while</span><span class="k2">(</span><span class="k1">true</span><span class="k2">)</span></td></tr><tr><td class="number">87</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">88</td><td>        read_fds <span class="k3">=</span> master<span class="k2">;</span></td></tr><tr><td class="number">89</td><td>        <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_688.html" target="_blank">select</a><span class="k2">(</span>fdmax<span class="k3">+</span><span class="n">1</span>, <span class="k3">&amp;</span>read_fds, NULL, NULL, NULL<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">90</td><td>            <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">92</td><td>        </td></tr><tr><td class="number">93</td><td>        <span class="c">/* for loop starts here */</span></td></tr><tr><td class="number">94</td><td>        <span class="k1">for</span><span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span><span class="k3">=</span> fdmax<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">95</td><td>            <span class="k1">if</span><span class="k2">(</span>FD_ISSET<span class="k2">(</span>i, <span class="k3">&amp;</span>read_fds<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">96</td><td>            <span class="k2">{</span></td></tr><tr><td class="number">97</td><td>                <span class="k1">if</span><span class="k2">(</span>i <span class="k3">=</span><span class="k3">=</span> listener<span class="k2">)</span></td></tr><tr><td class="number">98</td><td>                <span class="k2">{</span></td></tr><tr><td class="number">99</td><td>                    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>newfd <span class="k3">=</span> accept<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>remoteaddr, <span class="k3">&amp;</span>addrlen<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span></td></tr><tr><td class="number">100</td><td>                    <span class="k2">{</span> </td></tr><tr><td class="number">101</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Unable to accept connection.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">102</td><td>                        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>                    <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">104</td><td>                        FD_SET<span class="k2">(</span>newfd, <span class="k3">&amp;</span>master<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">105</td><td>                        <span class="k1">if</span> <span class="k2">(</span>newfd <span class="k3">&gt;</span> fdmax<span class="k2">)</span> <span class="k2">{</span>  </td></tr><tr><td class="number">106</td><td>                            fdmax <span class="k3">=</span> newfd<span class="k2">;</span></td></tr><tr><td class="number">107</td><td>                        <span class="k2">}</span></td></tr><tr><td class="number">108</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Accepted a new connection from %s on "</span> \</td></tr><tr><td class="number">109</td><td>                            <span class="s">"socket %d\n"</span>, \</td></tr><tr><td class="number">110</td><td>                            inet_ntoa<span class="k2">(</span>remoteaddr.sin_addr<span class="k2">)</span>, newfd<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>                        client_num<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">112</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Number of clients : %d\n"</span>, client_num<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">113</td><td>                    <span class="k2">}</span></td></tr><tr><td class="number">114</td><td>                <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">115</td><td>                    nbytes <span class="k3">=</span> recv<span class="k2">(</span>i, buf, <span class="k1">sizeof</span><span class="k2">(</span>buf<span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">116</td><td>                    <span class="k1">if</span><span class="k2">(</span>nbytes <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> nbytes <span class="k3">=</span><span class="k3">=</span> INVALID_SOCKET<span class="k2">)</span></td></tr><tr><td class="number">117</td><td>                    <span class="k2">{</span></td></tr><tr><td class="number">118</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Socket %d hung up\n"</span>, i<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">119</td><td>                        closesocket<span class="k2">(</span>i<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">120</td><td>                        FD_CLR<span class="k2">(</span>i, <span class="k3">&amp;</span>master<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>                        client_num--<span class="k2">;</span></td></tr><tr><td class="number">122</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Number of clients : %d\n"</span>, client_num<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td>                    <span class="k2">}</span></td></tr><tr><td class="number">124</td><td>                <span class="k2">}</span> </td></tr><tr><td class="number">125</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">126</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">127</td><td>        <span class="c">/* for loop ends here */</span></td></tr><tr><td class="number">128</td><td>        </td></tr><tr><td class="number">129</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">130</td><td>    </td></tr><tr><td class="number">131</td><td>    closesocket <span class="k2">(</span>listener<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">132</td><td>    WSACleanup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">133</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">134</td><td>    </td></tr><tr><td class="number">135</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Tue, 25 Dec 2007 05:11:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Indeed, it looks like fcntl is the Linux version of this function call. The windows version is <a href="http://msdn2.microsoft.com/en-us/library/ms738573.aspx">ioctlsocket</a>. As for <tt>recv()</tt> not running: Well... Yah. Did you even read the documentation on <tt>select()</tt> or the Beej guide? The way that code is set up, the socket MUST have something to read (and <tt>select()</tt> must say it does) before it will actually receive anything. As for setting the last parameter of <tt>select()</tt> to NULL:
</p><div class="quote_container"><div class="title">MSDN said:</div><div class="quote"><p>

<i>timeout</i></p><p>    Maximum time for select to wait, provided in the form of a TIMEVAL structure. <b>Set the timeout parameter to null for blocking operations.</b>
</p></div></div><p>
It would seem that it is not <tt>recv()</tt> that&#39;s blocking, but rather <tt>select()</tt>. To fix these problems, you need to set the socket to nonblocking mode with the Windows function call (the one mentioned above; there&#39;s a tutorial further down on the MSDN page). Then everything should fall into place.</p><p>As for your server:
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//the line</span>
<span class="k1">if</span><span class="k2">(</span>i <span class="k3">=</span><span class="k3">=</span> listener<span class="k2">)</span>
<span class="c">//should be</span>
<span class="k1">if</span><span class="k2">(</span>i <span class="k3">=</span><span class="k3">=</span> listener <span class="k3">&amp;</span><span class="k3">&amp;</span> num_clients <span class="k3">&lt;</span> <span class="n">2</span><span class="k2">)</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Tue, 25 Dec 2007 08:28:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Synapse said:</div><div class="quote"><p>

I mean, unless you just want to serve one client forever, or only wait for those blocking accept calls to serve more than one client.
</p></div></div><p>
If you believe threads to be the ideal solution for multiple clients you should not be giving out advice.</p><p>It is not.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Tue, 25 Dec 2007 14:38:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><span class="k1">if</span><span class="k2">(</span>i <span class="k3">=</span><span class="k3">=</span> listener <span class="k3">&amp;</span><span class="k3">&amp;</span> num_clients <span class="k3">&lt;</span> <span class="n">2</span><span class="k2">)</span></span><br />It didn&#39;t work. The third client was unable to connect but it didn&#39;t show &quot;Unable to connect&quot; error. Plus, when the third client tried to connect, the <tt>num_clients</tt> was reduced by 1. So I ended up with <tt>num_clients = 1</tt> eventhough there were two clients connected. And the server was not accepting any connections after that, even when a connected client disconnected. I hope you understand what I&#39;m trying to say. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>--------------------------------------------------------</p><p>Okay, I know how to send strings, but I have problem sending other stuff like floats and doubles. Following Beej&#39;s Guide, I tried to send double through the second method :</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">double</span> d <span class="k3">=</span> <span class="n">3490</span>.<span class="n">15926535</span><span class="k2">;</span>
send <span class="k2">(</span> s, <span class="k3">&amp;</span>d, <span class="k1">sizeof</span> <span class="k2">(</span> d <span class="k2">)</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span>  <span class="c">/* DANGER--non-portable! */</span>
</pre></div></div><p>

But heck, the second parameter only accept char. <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Tue, 25 Dec 2007 15:14:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You&#39;re only sending a group of bytes at a time , that&#39;s why it only accepts a char* , use something like
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">reinterpret_cast</span><span class="k3">&lt;</span><span class="k1">char</span><span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span><span class="k3">&amp;</span>d<span class="k2">)</span>
</pre></div></div><p>
for the char* parameter and see if it likes that better.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Tue, 25 Dec 2007 15:57:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Dustin: I did misunderstand his OP and I already said that I shouldn&#39;t have suggested threads. The fact still stands, however, that they are terribly useful and worth learning about with network programming. They are a viable solution to several problems that this kind of coding presents.</p><p>Fish: Oops! Indeed. Try this one:
</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//change this line</span>
<span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>newfd <span class="k3">=</span> accept<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>remoteaddr, <span class="k3">&amp;</span>addrlen<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
<span class="c">//to this:</span>
<span class="k1">if</span> <span class="k2">(</span>num_clients <span class="k3">&gt;</span> <span class="n">1</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>newfd <span class="k3">=</span> accept<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>remoteaddr, <span class="k3">&amp;</span>addrlen<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
</pre></div></div><p>
And ya, for that <tt>send()</tt> you need some sort of cast. I don&#39;t remember all the  C++ cast types, but I think you could just use a standard C-cast if you want.<br /><span class="source-code">send <span class="k2">(</span> s, <span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span><span class="k2">)</span><span class="k3">&amp;</span>d, <span class="k1">sizeof</span> <span class="k2">(</span> d <span class="k2">)</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Synapse Jumps)</author>
		<pubDate>Tue, 25 Dec 2007 22:34:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="source-code snippet"><div class="inner"><pre><span class="c">//change this line</span>
<span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>newfd <span class="k3">=</span> accept<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>remoteaddr, <span class="k3">&amp;</span>addrlen<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
<span class="c">//to this:</span>
<span class="k1">if</span> <span class="k2">(</span>num_clients <span class="k3">&gt;</span> <span class="n">1</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>newfd <span class="k3">=</span> accept<span class="k2">(</span>listener, <span class="k2">(</span>LPSOCKADDR<span class="k2">)</span><span class="k3">&amp;</span>remoteaddr, <span class="k3">&amp;</span>addrlen<span class="k2">)</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> SOCKET_ERROR<span class="k2">)</span>
</pre></div></div><p>

Maybe it would work, but I found a way to prevent extra clients from connecting. All I did was close the listener socket when <tt>client_num == MAX_CLIENTS</tt> and open it back when <tt>client_num &lt; MAX_CLIENTS</tt>. It&#39;s working perfectly now.</p><p>Okay, now I stumble upon another problem. Right now I&#39;m trying to develop a network pong game based on my MiniPong game. When the client presses the UP/DOWN directional button, it will send a message to the server, telling it to increase/decrease the y-velocity of the paddle. The server will then process the data ( adds the y-vel to the y-coor, multiply y-vel with friction, check collision, etc... ). I got this part working.</p><p>In the next stage, the server will send the <b>y-vel of player 1 ( the client itself )</b> and also the <b>y-vel of player 2 ( the other client )</b> back to both the clients <b>( or should I send the y-coordinates instead? )</b>. Here&#39;s my source codes, after reading Beej&#39;s Guide ( I&#39;m not sure whether I&#39;m following it correctly <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /> ) :</p><div class="source-code snippet"><div class="inner"><pre><span class="c">/* -----------  Server  -------------- */</span>
size_t packetsize<span class="k2">;</span>
<span class="c">//If client is player 1</span>
<span class="k1">if</span> <span class="k2">(</span> j <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k2">)</span> packetsize <span class="k3">=</span> pack <span class="k2">(</span> sendBuff, <span class="s">"ff"</span>, player_1.dy, player_2.dy <span class="k2">)</span><span class="k2">;</span>

<span class="c">//If client is player 2</span>
<span class="k1">else</span> packetsize <span class="k3">=</span> pack <span class="k2">(</span> sendBuff, <span class="s">"ff"</span>, player_2.dy, player_1.dy <span class="k2">)</span><span class="k2">;</span>

<span class="c">//I don't understand what's the use of this</span>
packi16 <span class="k2">(</span> sendBuff <span class="k3">+</span> <span class="n">1</span>, packetsize <span class="k2">)</span><span class="k2">;</span>

<span class="c">//Send it!</span>
send <span class="k2">(</span> csockets<span class="k2">[</span>j<span class="k2">]</span>, <span class="k1">reinterpret_cast</span><span class="k3">&lt;</span><span class="k1">char</span><span class="k3">*</span><span class="k3">&gt;</span><span class="k2">(</span> <span class="k3">&amp;</span>sendBuff <span class="k2">)</span>, <span class="k1">sizeof</span> <span class="k2">(</span> sendBuff <span class="k2">)</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="c">/* -----------  Client  -------------- */</span>
<span class="k1">unsigned</span> <span class="k1">char</span> recvBuffer<span class="k2">[</span><span class="n">1024</span><span class="k2">]</span><span class="k2">;</span>
<span class="k1">int</span> serverErr <span class="k3">=</span> recv <span class="k2">(</span> s, <span class="k1">reinterpret_cast</span><span class="k3">&lt;</span><span class="k1">char</span><span class="k3">*</span><span class="k3">&gt;</span> <span class="k2">(</span> <span class="k3">&amp;</span>recvBuffer <span class="k2">)</span>, <span class="k1">sizeof</span> <span class="k2">(</span> recvBuffer <span class="k2">)</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span>
<span class="k1">if</span> <span class="k2">(</span> serverErr <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> serverErr <span class="k3">=</span><span class="k3">=</span> INVALID_SOCKET <span class="k2">)</span>
<span class="k2">{</span>
    MessageBox <span class="k2">(</span> hWnd, <span class="s">"Disconnected from server!"</span>, <span class="s">"Error"</span>,
                   MB_ICONEXCLAMATION <span class="k3">|</span> MB_OK <span class="k3">|</span> MB_SYSTEMMODAL <span class="k2">)</span><span class="k2">;</span>
    SendMessage <span class="k2">(</span> hwnd, WM_DESTROY, wParam, lParam <span class="k2">)</span><span class="k2">;</span>
<span class="k1">else</span>
<span class="k2">{</span>
    unpack <span class="k2">(</span> recvBuffer, <span class="s">"ff"</span>, <span class="k3">&amp;</span>player_1.dy, <span class="k3">&amp;</span>player_2.dy <span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

When I test them, the clients hang! <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> I need to resolve this problem before moving on to the ball. ( a pong is no pong without the ball <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> )</p><p>[EDIT]<br />Oh wait, I think <tt>send()</tt> is blocking. Dang, I hate this...:&#39;( I&#39;ll try and fix it.</p><p>[EDIT2]<br />Fixed it. But the game is running darn slow. I think I should use UDP. <img src="http://www.allegro.cc/forums/smileys/lipsrsealed.gif" alt=":-X" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fishcake)</author>
		<pubDate>Wed, 26 Dec 2007 10:17:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I will answer...even if cookies have already been handed out!::)</p><p>I have <a href="http://www.allegro.cc/files/attachment/594048">attached</a> a crude, but working example on how to use socket programming and allegro in a console. It is called MyChat, but it is not a chat program. I decided to change it to see how fast the network code was. I have made several improvements since (the power of knowledge::)), but this should help you anyway. I set the gfx mode to show the output, but you could rip the networking code out and just make it a totally console app. The code is FAR from perfect, so don&#39;t expect any magical jellybeans or anything.:P This should help you some. Beej&#39;s guide and these have really helped:</p><p><a href="http://www.sockets.com/a_c2.htm">http://www.sockets.com/a_c2.htm</a><br /><a href="http://www.sockets.com/winsock.htm">http://www.sockets.com/winsock.htm</a><br /><a href="http://tangentsoft.net/wskfaq/examples/basics/">http://tangentsoft.net/wskfaq/examples/basics/</a> though tangetsoft.net seems to be down right now...maintenances?</p><p>I am still learning all of the little &quot;fun&quot; stuff about winsock, but I can help you a bit. Enjoy the code, and the journey...;)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Don Freeman)</author>
		<pubDate>Wed, 26 Dec 2007 15:01:37 +0000</pubDate>
	</item>
</rss>
