<?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[Problem mit verkapselten Sockets]]></title><description><![CDATA[<p>Ich bastele zur Zeit an einem kleinen Server (als Client benutze ich Telnet). Die angenommenen Verbindungen werden in einer std::list&lt;Client&gt; gespeichert, wobei ein Client den Socket und den Benutzernamen speichert und sich um das Schließen des Sockets kümmert. Den Socket, der Verbindungen annimmt, und die Clients werden über ein fd_set und select() verwaltet.<br />
Wenn ich jetzt aber eine Verbindung herstelle, führt jeder Aufruf von select() zu einem WSAENOTSOCK (der über eine get-Methode aus dem Client geholte Socket macht also Probleme).</p>
<p>Kann jemand sagen, woran das liegt / was ich anders machen muss? Eigentlich ist ein Socket unter Windows doch nur ein unsigned int, warum macht das dann diesen Fehler? Wenn ich die Clients einfach nur als Socket-Array speichere, dann funktioniert alles..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/69630/problem-mit-verkapselten-sockets</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Apr 2026 08:13:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/69630.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 30 Mar 2004 01:02:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Tue, 30 Mar 2004 01:02:09 GMT]]></title><description><![CDATA[<p>Ich bastele zur Zeit an einem kleinen Server (als Client benutze ich Telnet). Die angenommenen Verbindungen werden in einer std::list&lt;Client&gt; gespeichert, wobei ein Client den Socket und den Benutzernamen speichert und sich um das Schließen des Sockets kümmert. Den Socket, der Verbindungen annimmt, und die Clients werden über ein fd_set und select() verwaltet.<br />
Wenn ich jetzt aber eine Verbindung herstelle, führt jeder Aufruf von select() zu einem WSAENOTSOCK (der über eine get-Methode aus dem Client geholte Socket macht also Probleme).</p>
<p>Kann jemand sagen, woran das liegt / was ich anders machen muss? Eigentlich ist ein Socket unter Windows doch nur ein unsigned int, warum macht das dann diesen Fehler? Wenn ich die Clients einfach nur als Socket-Array speichere, dann funktioniert alles..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/491360</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/491360</guid><dc:creator><![CDATA[Lideric]]></dc:creator><pubDate>Tue, 30 Mar 2004 01:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Tue, 30 Mar 2004 17:53:26 GMT]]></title><description><![CDATA[<p>Ohne die relevanten Code-Ausschnitte bräuchte ich hellseherische Fähigkeiten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/491930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/491930</guid><dc:creator><![CDATA[Christoph]]></dc:creator><pubDate>Tue, 30 Mar 2004 17:53:26 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Wed, 31 Mar 2004 02:24:07 GMT]]></title><description><![CDATA[<p>Äh, klar.</p>
<p>Erstmal die Client-Klasse:</p>
<pre><code class="language-cpp">class Client
{
private:
	SOCKET m_sock;
	std::string m_ip;
	std::string m_name;

public:
	Client(SOCKET accsock); // ruft vor allem accept() auf, und wirft bei dessen Fehlschlag eine Exception
	~Client() { closesocket(m_sock); }
	SOCKET getSocket() { return m_sock; }
};
</code></pre>
<p>Und hier die relevanten Zeilen aus main():</p>
<pre><code class="language-cpp">int main()
{
	WSockHandler ws; // Ruft im Konstruktor WSAStartup() auf, und im Destruktor WSACleanup()
	SOCKET accepts = socket(AF_INET, SOCK_STREAM, 0);
	SOCKADDR_IN addr;
	memset(&amp;addr, 0, sizeof(SOCKADDR_IN));
	addr.sin_port = htons(23);
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = INADDR_ANY;
	bind(accepts, (SOCKADDR *)&amp;addr, sizeof(SOCKADDR_IN));
	listen(accepts, 10);

	timeval notime = {0,1};
	std::list&lt;Client&gt; clients;
	fd_set set;
	while (!appdone())
	{
		FD_ZERO(&amp;set);
		FD_SET(accepts, &amp;set);
		for (std::list&lt;Client&gt;::iterator it = clients.begin(); it != clients.end(); ++it)
		{
			SOCKET s = it-&gt;getSocket();
			if (s != INVALID_SOCKET)
				FD_SET(s, &amp;set);
		}
		if (select(0, &amp;set, 0, 0, &amp;notime) == SOCKET_ERROR)
		{
			std::cout &lt;&lt; timestamp() &lt;&lt; &quot;Error: Error while select()ing! Error code: &quot; &lt;&lt; WSAGetLastError() &lt;&lt; '\n';
			continue;
		}

		if (FD_ISSET(accepts, &amp;set))
		{
			try
			{
				clients.push_back(accepts);
			}
			catch (accept_failed) {}
		}

		/* Hier ist dann noch die restliche Abfrage des FD_SETs */
	}
}
</code></pre>
<p>Die Überprüfungen der Socketfuntionen habe ich rausgenommen, die laufen aber einwandfrei.</p>
<p>Das Problem ist wie gesagt der select()-Aufruf, sobald ich eine Verbindung aufbaue gibt es Fehlercodes zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/492115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/492115</guid><dc:creator><![CDATA[Lideric]]></dc:creator><pubDate>Wed, 31 Mar 2004 02:24:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Wed, 31 Mar 2004 08:27:51 GMT]]></title><description><![CDATA[<p>ich finde eine microsekunde ein bisschen kurz zum selecten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
übergib mal statt &amp;notime NULL (zum testen)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/492202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/492202</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Wed, 31 Mar 2004 08:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Wed, 31 Mar 2004 10:21:44 GMT]]></title><description><![CDATA[<p>Ändert auch nichts. Eine Mikrosekunde habe ich aber auch schon in einem anderen Programm verwendet, da lief das problemlos..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/492285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/492285</guid><dc:creator><![CDATA[Lideric]]></dc:creator><pubDate>Wed, 31 Mar 2004 10:21:44 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Wed, 31 Mar 2004 14:58:07 GMT]]></title><description><![CDATA[<p>Also erstmal folgendes:</p>
<blockquote>
<p>The parameter time-out controls how long the select can take to complete. If time-out is a null pointer, select will block indefinitely until at least one descriptor meets the specified criteria. Otherwise, time-out points to a TIMEVAL structure that specifies the maximum time that select should wait before returning. When select returns, the contents of the TIMEVAL structure are not altered. If TIMEVAL is initialized to {0, 0}, select will return immediately; this is used to poll the state of the selected sockets.</p>
</blockquote>
<p>timeval notime = {0,0};</p>
<p>wäre also einfach bezeichnender ( nicht besser oder richtiger ).</p>
<p>Ansonsten sieht soweit alles ok aus, deshalb würde ich vorschlagen, dass du mal den client-constructor postest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/492517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/492517</guid><dc:creator><![CDATA[Solid]]></dc:creator><pubDate>Wed, 31 Mar 2004 14:58:07 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Wed, 31 Mar 2004 21:44:29 GMT]]></title><description><![CDATA[<p>Kannst du haben, macht aber nicht viel mehr als in dem Kommentar stand:</p>
<pre><code class="language-cpp">Client::Client(SOCKET accsock)
{
	SOCKADDR_IN saddr;
	int len = sizeof(SOCKADDR_IN);
	m_sock = accept(accsock, (SOCKADDR *) &amp;saddr, &amp;len);
	if (m_sock == INVALID_SOCKET)
		throw accept_failed(&quot;Accept failed.&quot;);
	m_ip = inet_ntoa(saddr.sin_addr);
	// Loggen, Begrüßung senden
}
</code></pre>
<p>Und mit einem {0,0}-timeval war mir mal irgendwas komisches passiert, weiß nicht mehr was.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/492698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/492698</guid><dc:creator><![CDATA[Lideric]]></dc:creator><pubDate>Wed, 31 Mar 2004 21:44:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Thu, 01 Apr 2004 18:45:20 GMT]]></title><description><![CDATA[<p>Lideric schrieb:</p>
<blockquote>
<p>[...]</p>
<pre><code class="language-cpp">if (FD_ISSET(accepts, &amp;set))
		{
			try
			{
				clients.push_back(accepts);
			}
			catch (accept_failed) {}
		}

		/* Hier ist dann noch die restliche Abfrage des FD_SETs */
	}
}
</code></pre>
<p>[...]</p>
</blockquote>
<p>Ähmmm... Sieht irgendwie aus, als würde da ein Client-Objekt auf dem Stack erstellt ( clients.push_back(accepts) ), in dessen Constructor dann auch brav das accept erfolgt und m_sock auch brav initialisiert wird... dies wird dann an die Liste angehangen (kopiert), aber leider danach auch wieder zerstört ( closesocket() ). Damit ist die Socket dann geschlossen und das Client-Objekt in der Liste hat einen ungültigen Socket-Descriptor. Denk ich mir mal so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/493414</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/493414</guid><dc:creator><![CDATA[Solid]]></dc:creator><pubDate>Thu, 01 Apr 2004 18:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit verkapselten Sockets on Thu, 01 Apr 2004 19:05:11 GMT]]></title><description><![CDATA[<p>Oh, verdammt, tatsächlich. Dann muss ich wohl ein Bisschen was am Design ändern. ..<br />
Aber auf jeden Fall vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/493427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/493427</guid><dc:creator><![CDATA[Lideric]]></dc:creator><pubDate>Thu, 01 Apr 2004 19:05:11 GMT</pubDate></item></channel></rss>