<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>winsocks listen()</title>
		<link>http://www.allegro.cc/forums/view/370013</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 09 Jun 2004 20:55:24 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>what is the backlog in the <span class="source-code"><span class="k1">int</span> listen <span class="k2">(</span>SOCKET s, <span class="k1">int</span> backlog<span class="k2">)</span><span class="k2">;</span></span> function good for <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Tue, 08 Jun 2004 23:04:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Quoted directly from <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/listen_2.asp">MSDN</a>:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>&lt;b&gt;listen[/b}</p><p>The listen function places a socket in a state in which it is listening for an incoming connection.</p><p>int listen(<br />  SOCKET s,<br />  int backlog<br />);</p><p>Parameters</p><p><i>s</i><br />    [in] Descriptor identifying a bound, unconnected socket.<br /><i>backlog</i><br />    [in] Maximum length of the queue of pending connections. If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value.</p></div></div><p>

So the answer is that it&#39;s the size of the pending connections queue...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Tue, 08 Jun 2004 23:07:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When you create a socket, and put it to listen, you need to specify the amount of connection you want to handle. I believe Linux refuses new connections.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Tue, 08 Jun 2004 23:11:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>so if i want a server where 32 clients can connect at max i&#39;ll use 32 ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Tue, 08 Jun 2004 23:14:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yep
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Tue, 08 Jun 2004 23:22:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>and it just set the socket in the listen mode or does it wait until 32 clients have connected?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Tue, 08 Jun 2004 23:24:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, it sets the socket in listen mode. You then call <i>accept</i> to get incoming calls. Usually, you do a while like:</p><div class="source-code snippet"><div class="inner"><pre>    listen<span class="k2">(</span>oldsocket, <span class="n">32</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">while</span> <span class="k2">(</span><span class="k2">(</span>newsocket <span class="k3">=</span> accept<span class="k2">(</span>oldsocket, ...<span class="k2">)</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
        process_new_client<span class="k2">(</span>newsocket<span class="k2">)</span><span class="k2">;</span>
        ...
    <span class="k2">}</span>
</pre></div></div><p>

That piece of code is blocking
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Tue, 08 Jun 2004 23:36:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[edited]<br />and accept is a blocking function... how can i stop it
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 00:12:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><i>listen</i> returns immediately. <i>accept</i> is the one which blocks the socket until a client connects. You can use <i>fnctl</i> (Linux for sure... maybe Windows has it too?) to declare the socket as non blocking, or use <i>select</i> to simulate the non-blocking stuff.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 00:14:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>and the send and receive functions a re also blocking ones.<br />can i implement checking once for a package to receive with select too or how should this be done?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 00:19:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, you can use select to multiplex a program. Select has five parameters, the first one is the maximun descriptor plus one of socket to check, the second parameter is a bag (<i>fd_set</i>) with sockets to check for incoming information (receive data), the third parameter is a bag for outcoming information (send data), the fourth is a bag with sockets for exceptions, and the last parameter is the timeout <i>select</i> should wait before stopping checking the sockets. So, you can set sockets to listen into the second bag, and whenever one is set, you receive the information. This is the example in Linux:</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;sys/time.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;sys/types.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#include &lt;unistd.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></td></tr><tr><td class="number">7</td><td>main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">8</td><td>    fd_set rfds<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">struct</span> timeval tv<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">int</span> retval<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>    <span class="c">/* Watch stdin (fd 0) to see when it has input. */</span></td></tr><tr><td class="number">13</td><td>    FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>rfds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    FD_SET<span class="k2">(</span><span class="n">0</span>, <span class="k3">&amp;</span>rfds<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="c">/* Wait up to five seconds. */</span></td></tr><tr><td class="number">16</td><td>    tv.tv_sec <span class="k3">=</span> <span class="n">5</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    tv.tv_usec <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>    retval <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_688.html" target="_blank">select</a><span class="k2">(</span><span class="n">1</span>, <span class="k3">&amp;</span>rfds, NULL, NULL, <span class="k3">&amp;</span>tv<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="c">/* Don't rely on the value of tv now! */</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>    <span class="k1">if</span> <span class="k2">(</span>retval<span class="k2">)</span></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">"Data is available now.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>        <span class="c">/* FD_ISSET(0, &amp;rfds) will be true. */</span></td></tr><tr><td class="number">25</td><td>    <span class="k1">else</span></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">"No data within five seconds.\n"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

(Edited: In <i>FD_SET(0, &amp;rfds);</i> he sets socket 0 (<i>stdin</i>) in the bag for sockets to listen. Then calls <i>select</i> with 1 as first parameter (highest descriptor in all bags, in this case 0, plus one). <i>tv</i> holds how long select will wait for connections. Here is set for five seconds, so the program will block for 5 seconds in <i>select</i>. If you set 0, it becomes non-blocking.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 00:34:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ok and what to do that the receive function isn&#39;t blocking?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 01:06:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The only way I remember to make <i>recv</i> non blocking is using <i>fcntl</i>. With <i>select</i>, you peek the socket, if it has something, you call <i>recv</i> (which is still blocking, but since you know there is something to read, it returns immediately. If you need some code example from me, you need to wait until I go back home <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 01:16:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1.<br />you mean if a have a server thats sends all the time i could call the blocking functions without any lag, right?<br />2.<br />i read something about threaded servers as an alternative mehtod to select ones<br />3. <br />examples would be nice <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 01:22:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>backlog is NOT the number of clients you may have connected!  The backlog parameter refers to the number of clients that are waiting for you to call accept.  If you call listen with backlog 16, and before you call accept 17 people try to connect, 16 people will make it through, and 1 will be refused.  When you call accept once, there will be 15 people pending.  If 2 people try to connect then before the next accept call, one will be refused.  So on and so forth.  It is the number of <i>pending</i> connections waiting to be accepted before they are completely rejected.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gillius)</author>
		<pubDate>Wed, 09 Jun 2004 01:50:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>1. Yep. You peek the connection. If there is a new connection, you accept it, if you have data to be received, you receive it.<br />2. Basically, Apache gets a connection, creates a child (I used <i>fork</i>, but guess it uses threads) and lets the child take care of that connection.<br />3. Ok, will find my old mutiple chat program <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 01:56:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hmm so if i want to accept 32 clients then i have to set the backlog at least to 32 but better very high for there is the chance for as much as possible clients to wait (in a qeue) for my acception?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 02:01:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>hmm so if i want to accept 32 clients then i have to set the backlog at least to 32 but better very high for there is the chance for as much as possible clients to wait (in a qeue) for my acception?</p></div></div><p>
No. backlog is the amount of connections you can have pending - read gillius&#39; explanation again.</p><p>Here&#39;s a simple example: think of it as a queue outside a club - the queue size determines the number of people (connections) who can wait outside (pending connections) to be let inside (accept()ed) by the bouncers . If the club seats 32 people they can still have a queue with room for only one, as long as the guests arrive one at a time before being let in. However, if two people arrive at the same time (or between checks by the bouncer if there&#39;s someone to be let in), the first one will be put in the queue while the other is simply refused entry and is lost to the club as a customer. With a queue size of two, two people can wait outside, etc.</p><p>Hope that was simple enough <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (gnolam)</author>
		<pubDate>Wed, 09 Jun 2004 02:33:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><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">#ifdef WIN32</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">#else</span></td></tr><tr><td class="number">4</td><td>    <span class="p">#include &lt;sys/types.h&gt;</span></td></tr><tr><td class="number">5</td><td>    <span class="p">#include &lt;sys/socket.h&gt;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>    <span class="p">#define closesocket close</span></td></tr><tr><td class="number">8</td><td><span class="p">#endif</span></td></tr><tr><td class="number">9</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td><span class="p">#define D_PORT      4344</span></td></tr><tr><td class="number">12</td><td><span class="p">#define D_HOST      "localhost"</span></td></tr><tr><td class="number">13</td><td><span class="p">#define D_QUEUE     32</span></td></tr><tr><td class="number">14</td><td><span class="p">#define D_SOCKETS   16</span></td></tr><tr><td class="number">15</td><td><span class="p">#define D_INFO      256</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>    <span class="k1">struct</span> timeval tv<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    <span class="k1">struct</span> sockaddr_in addr<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">struct</span> hostent <span class="k3">*</span>host<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> descriptor<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    <span class="k1">int</span> result<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <span class="k1">int</span> cycle <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> sockets<span class="k2">[</span>D_SOCKETS<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    <span class="k1">int</span> sockets_index <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <span class="k1">unsigned</span> <span class="k1">int</span> maximun<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    <span class="k1">char</span> buffer<span class="k2">[</span>D_INFO<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    fd_set input<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>&#160;</td></tr><tr><td class="number">32</td><td>    <span class="c">/*  read the delay if any  */</span></td></tr><tr><td class="number">33</td><td>    <span class="k1">if</span> <span class="k2">(</span>argc <span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">34</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a> <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_55.html" target="_blank">atol</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">36</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">39</td><td>    WSADATA wsaData<span class="k2">;</span></td></tr><tr><td class="number">40</td><td>    WSAStartup<span class="k2">(</span>MAKEWORD<span class="k2">(</span><span class="n">2</span>, <span class="n">2</span><span class="k2">)</span>, <span class="k3">&amp;</span>wsaData<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td><span class="p">#endif  /*  WIN32  */</span></td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>    <span class="c">/*  create a socket  */</span></td></tr><tr><td class="number">44</td><td>    descriptor <span class="k3">=</span> socket<span class="k2">(</span>PF_INET, SOCK_STREAM, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    <span class="k1">if</span> <span class="k2">(</span>descriptor <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">46</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"socket"</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="k2">(</span><span class="n">1</span><span class="k2">)</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>&#160;</td></tr><tr><td class="number">50</td><td>    <span class="c">/*  get information about the host  */</span></td></tr><tr><td class="number">51</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span><span class="k3">&amp;</span>addr, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span>addr<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    host <span class="k3">=</span> gethostbyname<span class="k2">(</span>D_HOST<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    <span class="k1">if</span> <span class="k2">(</span>host <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">54</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"gethostbyname"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>        closesocket<span class="k2">(</span>descriptor<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">57</td><td>        WSACleanup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td><span class="p">#endif</span></td></tr><tr><td class="number">59</td><td>        <span class="k1">return</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span><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>    <span class="c">/*  bind the socket to an address and port  */</span></td></tr><tr><td class="number">63</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_566.html" target="_blank">memcpy</a><span class="k2">(</span><span class="k3">&amp;</span>addr.sin_addr, host-&gt;h_addr_list<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, <span class="k1">sizeof</span><span class="k2">(</span>host-&gt;h_addr_list<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>    addr.sin_family <span class="k3">=</span> AF_INET<span class="k2">;</span></td></tr><tr><td class="number">65</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>D_PORT<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    result <span class="k3">=</span> bind<span class="k2">(</span>descriptor, <span class="k2">(</span><span class="k1">struct</span> sockaddr <span class="k3">*</span><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="k2">;</span></td></tr><tr><td class="number">67</td><td>    <span class="k1">if</span> <span class="k2">(</span>result <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">68</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"bind"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>        closesocket<span class="k2">(</span>descriptor<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td><span class="p">#ifdef WIN32</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><span class="p">#endif</span></td></tr><tr><td class="number">73</td><td>        <span class="k1">return</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">75</td><td>&#160;</td></tr><tr><td class="number">76</td><td>    <span class="c">/*  listen for connections  */</span></td></tr><tr><td class="number">77</td><td>    result <span class="k3">=</span> listen<span class="k2">(</span>descriptor, D_QUEUE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>    <span class="k1">if</span> <span class="k2">(</span>result <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">79</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"listen"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>        closesocket<span class="k2">(</span>descriptor<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">82</td><td>        WSACleanup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td><span class="p">#endif</span></td></tr><tr><td class="number">84</td><td>        <span class="k1">return</span> <span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">86</td><td>&#160;</td></tr><tr><td class="number">87</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>sockets, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span>sockets<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>    maximun <span class="k3">=</span> descriptor<span class="k2">;</span></td></tr><tr><td class="number">89</td><td>&#160;</td></tr><tr><td class="number">90</td><td>    result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>    <span class="k1">while</span> <span class="k2">(</span>result <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">92</td><td>        FD_ZERO<span class="k2">(</span><span class="k3">&amp;</span>input<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">93</td><td>        FD_SET<span class="k2">(</span>descriptor, <span class="k3">&amp;</span>input<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">94</td><td>        <span class="k1">for</span> <span class="k2">(</span>result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> result <span class="k3">&lt;</span> sockets_index<span class="k2">;</span> result<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">95</td><td>            FD_SET<span class="k2">(</span>sockets<span class="k2">[</span>result<span class="k2">]</span>, <span class="k3">&amp;</span>input<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>&#160;</td></tr><tr><td class="number">97</td><td>        tv.tv_sec  <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a><span class="k2">;</span></td></tr><tr><td class="number">98</td><td>        tv.tv_usec <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">99</td><td>        <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_128.html" target="_blank">delay</a> <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">100</td><td>            result <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_688.html" target="_blank">select</a><span class="k2">(</span>maximun <span class="k3">+</span> <span class="n">1</span>, <span class="k3">&amp;</span>input, NULL, NULL, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td>        <span class="k1">else</span></td></tr><tr><td class="number">102</td><td>            result <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_688.html" target="_blank">select</a><span class="k2">(</span>maximun <span class="k3">+</span> <span class="n">1</span>, <span class="k3">&amp;</span>input, NULL, NULL, <span class="k3">&amp;</span>tv<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td>        <span class="k1">switch</span> <span class="k2">(</span>result<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">104</td><td>            <span class="c">/*  error in select  */</span></td></tr><tr><td class="number">105</td><td>            <span class="k1">case</span> <span class="k3">-</span><span class="n">1</span><span class="k2">:</span></td></tr><tr><td class="number">106</td><td>                <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"select"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">107</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">108</td><td>&#160;</td></tr><tr><td class="number">109</td><td>            <span class="c">/*  nothing to process  */</span></td></tr><tr><td class="number">110</td><td>            <span class="k1">case</span> <span class="n">0</span><span class="k2">:</span></td></tr><tr><td class="number">111</td><td>                <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">112</td><td>&#160;</td></tr><tr><td class="number">113</td><td>            <span class="c">/*  a number of sockets are ready for reading  */</span></td></tr><tr><td class="number">114</td><td>            default:</td></tr><tr><td class="number">115</td><td>                <span class="c">/*  check if the descriptor set is our listening one  */</span></td></tr><tr><td class="number">116</td><td>                <span class="k1">if</span> <span class="k2">(</span>FD_ISSET<span class="k2">(</span>descriptor , <span class="k3">&amp;</span>input<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">117</td><td>                    sockets<span class="k2">[</span>sockets_index<span class="k2">]</span> <span class="k3">=</span> accept<span class="k2">(</span>descriptor, NULL, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">118</td><td>                    <span class="k1">if</span> <span class="k2">(</span>sockets<span class="k2">[</span>sockets_index<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">119</td><td>                        <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"accept"</span><span class="k2">)</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>                    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">122</td><td>                        <span class="k1">if</span> <span class="k2">(</span>sockets<span class="k2">[</span>sockets_index<span class="k2">]</span> <span class="k3">&gt;</span> maximun<span class="k2">)</span></td></tr><tr><td class="number">123</td><td>                            maximun <span class="k3">=</span> sockets<span class="k2">[</span>sockets_index<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">124</td><td>&#160;</td></tr><tr><td class="number">125</td><td>                        sockets_index<span class="k3">+</span><span class="k3">+</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>                <span class="k2">}</span></td></tr><tr><td class="number">128</td><td>                <span class="c">/*  one of the sockets is sending data. Find it  */</span></td></tr><tr><td class="number">129</td><td>                <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">130</td><td>                    <span class="k1">for</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">&lt;</span> sockets_index<span class="k2">;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">131</td><td>                        <span class="k1">if</span> <span class="k2">(</span>FD_ISSET<span class="k2">(</span>sockets<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span>, <span class="k3">&amp;</span>input<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">132</td><td>                            <a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>buffer, <span class="n">0</span>, <span class="k1">sizeof</span><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">133</td><td>&#160;</td></tr><tr><td class="number">134</td><td>                            <span class="c">/*  read information from socket  */</span></td></tr><tr><td class="number">135</td><td>                            result <span class="k3">=</span> recv<span class="k2">(</span>sockets<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span>, buffer, <span class="k1">sizeof</span><span class="k2">(</span>buffer<span class="k2">)</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">136</td><td>                            <span class="k1">if</span> <span class="k2">(</span>result <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">137</td><td>                                <a href="http://www.delorie.com/djgpp/doc/libc/libc_615.html" target="_blank">perror</a><span class="k2">(</span><span class="s">"recv"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">138</td><td>                            <span class="k1">else</span></td></tr><tr><td class="number">139</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">"Received %d bytes from descriptor %d: %s\n"</span>, result, sockets<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span>, buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">140</td><td>                        <span class="k2">}</span></td></tr><tr><td class="number">141</td><td>                    <span class="k2">}</span></td></tr><tr><td class="number">142</td><td>                <span class="k2">}</span></td></tr><tr><td class="number">143</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">144</td><td>&#160;</td></tr><tr><td class="number">145</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">"%d\r"</span>, cycle<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">146</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">147</td><td>&#160;</td></tr><tr><td class="number">148</td><td>    <span class="k1">for</span> <span class="k2">(</span>result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> result <span class="k3">&lt;</span> sockets_index<span class="k2">;</span> result<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">149</td><td>        closesocket<span class="k2">(</span>sockets<span class="k2">[</span>sockets_index<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">150</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">151</td><td>&#160;</td></tr><tr><td class="number">152</td><td>    closesocket<span class="k2">(</span>descriptor<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">153</td><td><span class="p">#ifdef WIN32</span></td></tr><tr><td class="number">154</td><td>    WSACleanup<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">155</td><td><span class="p">#endif</span></td></tr><tr><td class="number">156</td><td>&#160;</td></tr><tr><td class="number">157</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">158</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Ok, here is a very small program. Put this into a file and add it to a VC project, add <i>Ws2_32.lib</i> library for linking, and compile it. Under MinGW, use <i>g++ main.cpp -o main.exe -lwsock32</i>. Execute it. By default, it is a non blocking program. There is a number counting advancing to show you it is not blocking the execution.</p><p>Now, run a telnet (<i>telnet localhost 4344</i>). Telnet will connect, and everytime you type something, it will send the letter to the server. You can connect up to 32 telnets. Every time you type a letter, the server prints the socket and the letter. If you see the Task Manager, the program would be taking like 99% of CPU.</p><p>If you want your server to wait for 1 second before continuing processing, pass 1 as argument. You will notice I set the new delay. This time, the server will wait for 1 second before continuing with the program. Finally, if you want to make the program blocking, pass -1 as argument. If you check the code, I call <i>select</i> with NULL as last parameter to block it.</p><p>Be careful! I am not doing error handling when a telnet shuts down, so if you do it will get mad <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> I hope the example is good enough.</p><p>(Edited: Non-Windows support is not tested, too sleepy to turn my other computer on, but should work with one or two hacks).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 09:33:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Two notes:<br />- Windows limits waiting connections queue to 5 (probably Linux does it too) so passing anything greater than 5 to listen() will behave as you&#39;ve passed 5.<br />- There is no fcntl under Windows, but there is ioctlsocket() which can be used to set blocking mode and is similar to Linux ioctl().</p><p>If you&#39;d like to look at wrapper I&#39;ve written and C++ with STL doesn&#39;t scare you, click links below. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /><br /><a href="http://sphere.pl/~krzysiek/files/netwrapper.cpp">http://sphere.pl/~krzysiek/files/netwrapper.cpp</a><br /><a href="http://sphere.pl/~krzysiek/files/netwrapper.h">http://sphere.pl/~krzysiek/files/netwrapper.h</a></p><p>Linux support isn&#39;t implemented yet, but it won&#39;t be hard. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Wed, 09 Jun 2004 09:59:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">MSDN said:</div><div class="quote"><p>Compatibility<br />The backlog parameter is limited (silently) to a reasonable value as determined by the underlying service provider. Illegal values are replaced by the nearest legal value. There is no standard provision to find out the actual backlog value.</p></div></div><p>

Could it be that TCP/IP limits it to 5, and so anytime using *_INET family it is limited to 5?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 10:12:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>i think i got it now <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> nice explanation gnolam.<br />so for me it is good to take the maximum 5...<br />i&#39;ll try your pieces of code now...</p><p>btw what version of winsock is &quot;the best&quot; to use?<br />1.1 is a bit out of date, and there are 2.0 and i believe 2.2...<br />2.0 sounds good to me
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 18:29:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
If you don&#39;t need features present only in 2.0 you don&#39;t really have a reason to use it...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 09 Jun 2004 18:58:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>so you think better using 1.1 for better compatibility?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 20:17:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Yes. It&#39;s likely that everything you need is in 1.1, and that will also ensure portability as you will mostly be using BSD socket functions, which are easily ported to any *nix platform later.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 09 Jun 2004 20:19:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm... it is most likely even Win95 uses 2.0 (I always had to download the Windows Update to fix some IE problems). But if you are just sending information, 1.0 or 1.1 should work. I am not sure which bugs 2.0 fixed, though. My choose is to go to 2.0, and if someone is using Win95, they should install the Winsock update (like 700kb).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 09 Jun 2004 20:20:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>that&#39;s right the winsock 2 update isn&#39;t so hard to do.</p><p>(hmmm anyone knows how to give credits here in this forum)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Frank Drebin)</author>
		<pubDate>Wed, 09 Jun 2004 20:50:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
<a href="http://www.monkeyblah.com/allegro/unofficial-posters-guide.html#been-there-done-that">It&#39;s in the guide</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (X-G)</author>
		<pubDate>Wed, 09 Jun 2004 20:55:24 +0000</pubDate>
	</item>
</rss>
