<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[FD_SET und die Sockets]]></title><description><![CDATA[<p>Hallo,</p>
<p>versuche grade sockets anhand des fd_set zu verwalten, also mehrere verbindungen annehmen etc.</p>
<p>das klappt bei der aller ersten verbindung wunderbar, sie wird angenommen, daten ausgetauscht und geschloßen sowie aus dem FD_SET entfernt.<br />
Nur bei jedem weiteren Socket passiert gar nichts, irgendwie liefert der select immer SOCKET_ERROR zurück.</p>
<p>Hier mal der code</p>
<p>Diese Routine nimmt die verbindungen an:</p>
<pre><code class="language-cpp">bool CTCPServer::CheckForNewConnection()
{
	/* Prüft ob am AcceptSocket eine Verbindung aufgebaut wurde, wenn ja
		wird die Verbindung an einem freien Socket in Array aufgebaut, sofern
		noch 1 Platz frei ist. */
	int		iStatus = 0;
	bool	freeSocketFound = false;

	iStatus = select(0, &amp;(this-&gt;fdSet), NULL, NULL, NULL);

	if(iStatus != SOCKET_ERROR)
	{
		if(FD_ISSET(this-&gt;AcceptSocket, &amp;(this-&gt;fdSet)))
			for(int i=0; i &lt; MAX_CLIENTS_TO_CONNECT; i++)
				if(this-&gt;SocketArray[i] == INVALID_SOCKET)
				{
					this-&gt;SocketArray[i] = accept(this-&gt;AcceptSocket, NULL, NULL);
					FD_SET(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet));
					std::cout&lt;&lt;&quot;CheckForNewConnection: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] mit Verbindung besetzt\n&quot;;
					freeSocketFound = true;
					break;
				}
	}

	return freeSocketFound;
}
</code></pre>
<p>Die Receiveroutine empfängt und schließt, wenn nichts mehr empfangen wird von dem socket[x]</p>
<pre><code class="language-cpp">void CTCPServer::ReceiveDataOnSocket()
{
	/* Empfängt Daten für jeden gültigen Socket, wenn Receive Null zurückgibt,
		ist die Verbindung beendet worden. Dann wird der Socket geschloßen und wieder
		auf INVALID_SOCKET gesetzt. */
	for(int i = 0; i &lt; MAX_CLIENTS_TO_CONNECT; i++)
	{
		if(this-&gt;SocketArray[i] != INVALID_SOCKET)
		{
			if(FD_ISSET(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet)))
			{
				unsigned long iRecv = CCreateSocket::ReceivData(this-&gt;SocketArray[i]);
				if(iRecv == 0)
				{
					closesocket(this-&gt;SocketArray[i]);
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde geschloßen\n&quot;;
					this-&gt;SocketArray[i] = INVALID_SOCKET;
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde auf INVALID_SOCKET gesetzt\n&quot;;
					FD_CLR(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet));
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde mit FD_CLR aus &amp;fdset entfernt\n&quot;;
				}
			}

			}
	}	
}
</code></pre>
<p>Die beiden Routinen werden im loop nacheinander aufgerufen.</p>
<p>erkennt jemand warum dass einmal klappt aber kein weiteresmal?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/174674/fd_set-und-die-sockets</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 01:42:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/174674.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Mar 2007 20:03:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to FD_SET und die Sockets on Thu, 01 Mar 2007 20:03:20 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>versuche grade sockets anhand des fd_set zu verwalten, also mehrere verbindungen annehmen etc.</p>
<p>das klappt bei der aller ersten verbindung wunderbar, sie wird angenommen, daten ausgetauscht und geschloßen sowie aus dem FD_SET entfernt.<br />
Nur bei jedem weiteren Socket passiert gar nichts, irgendwie liefert der select immer SOCKET_ERROR zurück.</p>
<p>Hier mal der code</p>
<p>Diese Routine nimmt die verbindungen an:</p>
<pre><code class="language-cpp">bool CTCPServer::CheckForNewConnection()
{
	/* Prüft ob am AcceptSocket eine Verbindung aufgebaut wurde, wenn ja
		wird die Verbindung an einem freien Socket in Array aufgebaut, sofern
		noch 1 Platz frei ist. */
	int		iStatus = 0;
	bool	freeSocketFound = false;

	iStatus = select(0, &amp;(this-&gt;fdSet), NULL, NULL, NULL);

	if(iStatus != SOCKET_ERROR)
	{
		if(FD_ISSET(this-&gt;AcceptSocket, &amp;(this-&gt;fdSet)))
			for(int i=0; i &lt; MAX_CLIENTS_TO_CONNECT; i++)
				if(this-&gt;SocketArray[i] == INVALID_SOCKET)
				{
					this-&gt;SocketArray[i] = accept(this-&gt;AcceptSocket, NULL, NULL);
					FD_SET(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet));
					std::cout&lt;&lt;&quot;CheckForNewConnection: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] mit Verbindung besetzt\n&quot;;
					freeSocketFound = true;
					break;
				}
	}

	return freeSocketFound;
}
</code></pre>
<p>Die Receiveroutine empfängt und schließt, wenn nichts mehr empfangen wird von dem socket[x]</p>
<pre><code class="language-cpp">void CTCPServer::ReceiveDataOnSocket()
{
	/* Empfängt Daten für jeden gültigen Socket, wenn Receive Null zurückgibt,
		ist die Verbindung beendet worden. Dann wird der Socket geschloßen und wieder
		auf INVALID_SOCKET gesetzt. */
	for(int i = 0; i &lt; MAX_CLIENTS_TO_CONNECT; i++)
	{
		if(this-&gt;SocketArray[i] != INVALID_SOCKET)
		{
			if(FD_ISSET(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet)))
			{
				unsigned long iRecv = CCreateSocket::ReceivData(this-&gt;SocketArray[i]);
				if(iRecv == 0)
				{
					closesocket(this-&gt;SocketArray[i]);
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde geschloßen\n&quot;;
					this-&gt;SocketArray[i] = INVALID_SOCKET;
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde auf INVALID_SOCKET gesetzt\n&quot;;
					FD_CLR(this-&gt;SocketArray[i], &amp;(this-&gt;fdSet));
					std::cout&lt;&lt;&quot;ReceiveDataOnSocket: SocketArray[&quot;&lt;&lt;i&lt;&lt;&quot;] wurde mit FD_CLR aus &amp;fdset entfernt\n&quot;;
				}
			}

			}
	}	
}
</code></pre>
<p>Die beiden Routinen werden im loop nacheinander aufgerufen.</p>
<p>erkennt jemand warum dass einmal klappt aber kein weiteresmal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237724</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237724</guid><dc:creator><![CDATA[haraldy]]></dc:creator><pubDate>Thu, 01 Mar 2007 20:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Fri, 02 Mar 2007 06:20:17 GMT]]></title><description><![CDATA[<p>Wenn einer der Sockets im fd_set nach dem select() mal nicht gesetzt ist, setzt Du ihn vor dem nächsten select() mit FD_SET wieder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237843</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 02 Mar 2007 06:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Fri, 02 Mar 2007 07:43:39 GMT]]></title><description><![CDATA[<p>Wie LordJaxom schon schrieb, liegt Dein Fehler darin, dass Du <strong>this-&gt;fdSet</strong> direkt verwendest. <strong>select()</strong> verändert das nämlich. Also musst Du vor jedem <strong>select()</strong> am einfachsten eine &quot;Arbeitskopie&quot; machen. Mit dieser &quot;Arbeitskopie&quot; musst Du dann auch in <strong>ReceiveDataOnSocket()</strong> arbeiten. Hoffe es wird so klarer. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1237855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1237855</guid><dc:creator><![CDATA[joede]]></dc:creator><pubDate>Fri, 02 Mar 2007 07:43:39 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Fri, 02 Mar 2007 11:46:20 GMT]]></title><description><![CDATA[<p>hab gesehen, dass jede zusätzliche socketverbindung immer auf den selben platz in meinem SocketArray[i] gesetzt wird, weil der vorherige wohl mittlerweile invalid geworden ist und deswegen wieder als &quot;freier&quot; platz gehandelt wird...</p>
<p>ich kopiere mir das fdset als in ein fdset2 mit dem ich dann den receive durchführe?</p>
<p>die veränderung die das fd_set macht, kann mir dazu jemand einen link geben? ich verstehe das derzeit nicht so richtig, wieso sich die verändungen so seltsam auswirken. oder einfach ein kleines beispiel <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238003</guid><dc:creator><![CDATA[haraldy]]></dc:creator><pubDate>Fri, 02 Mar 2007 11:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Fri, 02 Mar 2007 11:50:10 GMT]]></title><description><![CDATA[<p>fd_set ist doch auch nur ein Bitfeld. Wobei jedes Bit einen Socket (bzw. eine Socket-Nummer) repräsentiert.</p>
<p>Anstatt zu sagen select setzt alle Bits auf deren Sockets etwas passiert ist hilft Dir evtl. folgende Betrachtung:<br />
Du <strong>setzt</strong> alle Bits in einem fd_set, deren Socket Du beobachten möchtest. Select <strong>löscht</strong> alle Bits auf deren Sockets <strong>nichts</strong> passiert ist. Ich denke daraus lässt sich recht einfach schliessen, dass Du vor dem nächsten select erstmal wieder alle Bits <strong>setzen</strong> musst, die durch select gelöscht wurden (oder Du kopierst Dir den fd_set mit allen gesetzten Bits einmal weg).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1238008</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1238008</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 02 Mar 2007 11:50:10 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Wed, 14 Mar 2007 17:30:24 GMT]]></title><description><![CDATA[<p>bei dieser codezeile:</p>
<pre><code class="language-cpp">this-&gt;SocketArray[i] = accept(this-&gt;AcceptSocket, NULL, NULL);
</code></pre>
<p>muss ich, nachdem ich die verbindung an socketArray[i] angenommen hab, den AcceptSocket wieder neu aufbauen oder kann dieser ohne weiteres so gelassen werden um die nächste verbindung anzunehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245649</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245649</guid><dc:creator><![CDATA[haraldy]]></dc:creator><pubDate>Wed, 14 Mar 2007 17:30:24 GMT</pubDate></item><item><title><![CDATA[Reply to FD_SET und die Sockets on Wed, 14 Mar 2007 21:57:48 GMT]]></title><description><![CDATA[<p>Bleibt solange, bis du ihn explizit schließt (oder was kaputt geht). Musst also nichts weiter machen, nur den Rückgabewert von accept solltest du noch prüfen, für den Fall dass accept fehlgeschlagen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1245795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1245795</guid><dc:creator><![CDATA[Der Meister]]></dc:creator><pubDate>Wed, 14 Mar 2007 21:57:48 GMT</pubDate></item></channel></rss>