<?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[[Sockets] Select für mehr als 64 Sockets]]></title><description><![CDATA[<p>Hallo</p>
<p>ich möchte, wie der Titel schon sagt, Select auf mehrere Sockets anwenden.</p>
<p>Da der Code unter Realbedingungen schwer zu testen ist, wollte ich einfach nur<br />
mal ein kurzes Feedback ob das so richtig ist vom Prinzip her.</p>
<pre><code class="language-cpp">fd_set *bigset = reinterpret_cast&lt;fd_set *&gt;(new char[sizeof(u_int) + sizeof(SOCKET) * numsockets]);

FD_ZERO(bigset);

#ifdef FD_SETSIZE
#undef FD_SETSIZE
#endif
#define FD_SETSIZE numsockets

for (unsigned i = 0; i &lt; numsockets; ++i)
	FD_SET(sockets[i], bigset);

timeval tv;
tv.tv_usec = (milliseconds % 1000) * 1000;
tv.tv_sec = milliseconds / 1000;

select(0, bigset, 0, 0, &amp;tv);

// aufräumcode gekürzt
</code></pre>
<p>ob das standartkonform ist, ist mir egal es muss nur unter windows xp<br />
laufen <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/topic/236709/sockets-select-für-mehr-als-64-sockets</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Apr 2026 17:08:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/236709.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 Mar 2009 21:01:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Sockets] Select für mehr als 64 Sockets on Wed, 18 Mar 2009 21:01:23 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich möchte, wie der Titel schon sagt, Select auf mehrere Sockets anwenden.</p>
<p>Da der Code unter Realbedingungen schwer zu testen ist, wollte ich einfach nur<br />
mal ein kurzes Feedback ob das so richtig ist vom Prinzip her.</p>
<pre><code class="language-cpp">fd_set *bigset = reinterpret_cast&lt;fd_set *&gt;(new char[sizeof(u_int) + sizeof(SOCKET) * numsockets]);

FD_ZERO(bigset);

#ifdef FD_SETSIZE
#undef FD_SETSIZE
#endif
#define FD_SETSIZE numsockets

for (unsigned i = 0; i &lt; numsockets; ++i)
	FD_SET(sockets[i], bigset);

timeval tv;
tv.tv_usec = (milliseconds % 1000) * 1000;
tv.tv_sec = milliseconds / 1000;

select(0, bigset, 0, 0, &amp;tv);

// aufräumcode gekürzt
</code></pre>
<p>ob das standartkonform ist, ist mir egal es muss nur unter windows xp<br />
laufen <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/1682464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682464</guid><dc:creator><![CDATA[steckverbindung]]></dc:creator><pubDate>Wed, 18 Mar 2009 21:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to [Sockets] Select für mehr als 64 Sockets on Wed, 18 Mar 2009 23:11:37 GMT]]></title><description><![CDATA[<p>eher andersrum<br />
du darfst definieren und die winsock2.h macht</p>
<pre><code>#ifndef FD_SETSIZE
#define FD_SETSIZE	64
#endif
</code></pre>
<p>du mußt das als definieren, bevor du die winsock2.h inkludierst oder irgendeine *.h, die sie inkludiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1682509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682509</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 18 Mar 2009 23:11:37 GMT</pubDate></item><item><title><![CDATA[Reply to [Sockets] Select für mehr als 64 Sockets on Thu, 19 Mar 2009 01:13:51 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a>:<br />
Was ich weiss muss man nur die Struktur richtig zusammenbauen.<br />
Also dass als erstes ein u_int mit N kommt, und dann halt die SOCKETs.</p>
<p>@steckverbindung:<br />
Bei x64 wird's deinen Code vermutlich aufstellen, weil du das Structure-Alignment/Padding nicht berücksichtigst.<br />
u_int ist auf x64 AFAIK weiterhin 4 Byte, aber SOCKET (UINT_PTR) ist 8 Byte. Default Packing vom VS is 8, d.h. VS wird zwischen dem u_int und dem SOCKET Array 4 Byte Padding reinknallen (damit das Array bei Offset 8 anfängt).</p>
<p>Die ganz einfache Variante wäre IMO sowas in der Art:</p>
<pre><code class="language-cpp">std::vector&lt;SOCKET&gt; my_fd_set;
// evtl.: my_fd_set.reserve(...);
my_fd_set.push_back(0); // erstmal dummy für fd_count

// SOCKETs reinstecken
for (...)
    my_fd_set.push_back(...);

my_fd_set[0] = my_fd_set.size() - 1; // fixup fd_count

timeval tv;
tv.tv_usec = (milliseconds % 1000) * 1000;
tv.tv_sec = milliseconds / 1000;

int rc = select(0, reinterpret_cast&lt;fd_set*&gt;(&amp;(my_fd_set[0]), 0, 0, &amp;tv);
</code></pre>
<p>Das sollte mit x86 und x64 funktionieren, und ist IMO etwas schöner.</p>
<p>Oder man kapselt gleich die ganzen hässlichen Details in einer Klasse weg:</p>
<pre><code class="language-cpp">class big_fd_set
{
public:
	static size_t const npos = ~size_t(0);

	explicit big_fd_set(size_t reservation = 500)
	{
		m_vec.reserve(reservation + 1);
		m_vec.push_back(0); // dummy fd_count
	}

	void clear()
	{
		m_vec.clear();
		m_vec.push_back(0); // dummy fd_count
	}

	size_t count() const
	{
		assert(m_vec.size() &gt;= 1);
		return m_vec.size() - 1;
	}

	size_t index_of(SOCKET s) const
	{
		std::vector&lt;SOCKET&gt;::iterator const it = find_it(s);
		if (it != m_vec.end())
			return std::distance(m_vec.begin() + 1, it);
		else
			return npos;
	}

	bool contains(SOCKET s) const
	{
		return index_of(s) != npos;
	}

	bool add(SOCKET s)
	{
		if (!contains(s))
		{
			m_vec.push_back(s);
			return true;
		}
		else
			return false;
	}

	bool remove(SOCKET s)
	{
		std::vector&lt;SOCKET&gt;::iterator const it = find_it(s);
		if (it != m_vec.end())
		{
			m_vec.erase(it);
			return true;
		}
		else
			return false;
	}

	fd_set* get_fd_set()
	{
		assert(m_vec.size() &gt;= 1);
		m_vec[0] = m_vec.size() - 1; // fix-up fd_count
		return reinterpret_cast&lt;fd_set*&gt;(&amp;(m_vec[0]));
	}

	operator fd_set* ()
	{
		return get_fd_set();
	}

private:
	std::vector&lt;SOCKET&gt;::iterator find_it(SOCKET s) const
	{
		assert(m_vec.size() &gt;= 1);
		return std::find(m_vec.begin() + 1 /* skip fd_count */, m_vec.end(), s);
	}

	std::vector&lt;SOCKET&gt; mutable m_vec;
};
</code></pre>
<p>(ungetestet, aber müsste IMO funktionieren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1682522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682522</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 19 Mar 2009 01:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to [Sockets] Select für mehr als 64 Sockets on Thu, 19 Mar 2009 14:12:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/106">@volkard</a></p>
<p>ich dachte mir, dass ich die winsock includiere und die FD_SETSIZE auf 64 setzt.<br />
dann wird meine funktion kompiliert, setz FD_SETSIZE auf numsockets, was zur<br />
folge hat, dass die makros FD_irgentwas mit &quot;numsockets&quot; arbeiten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a></p>
<p>vielen dank für diese klasse, ich denke das kann ich so übernehmen <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>
<p>@allgemeinheit</p>
<p>wenn ich aus code in eine 32-bit DLL erzeuge, wird die auf einem 64-bit OS<br />
gegen eine 32 oder 64 bit wsock.dll gelinkt? (zur laufzeit)</p>
<p>da gibts doch bestimmt einen kompatiblitätsmodus für 32 bit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1682809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1682809</guid><dc:creator><![CDATA[steckverbindung]]></dc:creator><pubDate>Thu, 19 Mar 2009 14:12:17 GMT</pubDate></item></channel></rss>