<?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[struct geht verloren (Socket, Threads)]]></title><description><![CDATA[<p>Ich weiß, dass es viel Quelltext ist und ich hab dazu noch wenig Angaben, wo genau der Fehler liegt - der Code is wahrscheinlich auch ein wenig unübersichtlich und zeigt, dass ich nicht der beste Programmierer bin - aber im thread waitforanswer wird der String richtig empfangen<br />
Beim ersten mal geht auch alles super im command-Thread, aber wenn der Thread zum zweiten mal startet, ist der Pointer auf einmal fehlerhaft (also ich bekomme keinen Zugriffsfehler, aber auf einmal sind völlig komische Werte in dem struct (DATA) - der Socket hat viel zu viele Stellen, der string buffer ist &quot;&quot;, der state ist -44 oder so was in der Richtung und das Handle isfree hat auch ne mehr, als eigenartige Adresse im Heap - zumindest lt. Debugger) - und ich finde den Fehler einfach nicht - wäre sehr dankbar über einen Tip.<br />
Danke schon mal...</p>
<pre><code class="language-cpp">#define maxHandle		2
#define exitH			0
#define sendH			1

typedef pair &lt;WSAEVENT*, SOCKET&gt; paar;

struct sthreads
	{
		vector &lt;paar&gt; handles;
		unsigned __int16 ceil;
		HANDLE isfree;
	};
</code></pre>
<pre><code class="language-cpp">void waitforanswer (void *threads)
	{
		std::auto_ptr &lt;sthreads&gt; D (static_cast &lt;sthreads*&gt; (threads));
		unsigned __int32 z = D-&gt;ceil;
		SOCKET s = D-&gt;handles[z].second;
		WSAEventSelect (s, D-&gt;handles[z].first[sendH], FD_READ);
		WSAEVENT e[maxHandle];
		e[exitH] = D-&gt;handles[z].first[exitH];
		e[sendH] = D-&gt;handles[z].first[sendH];
		SetEvent (D-&gt;isfree);
		data *DATA = new data;
		DATA-&gt;sock = s;
		DATA-&gt;isfree = CreateEvent (NULL, false, false, NULL);
		DATA-&gt;buffer = &quot;&quot;;
		DATA-&gt;state = state_empty;
		_beginthread (command, 0, (void *) DATA);
		SetEvent (DATA-&gt;isfree);
		char buf[l]; memset (buf, 0, l);
		signed __int32 E = 1;
		while ((E != 0) &amp;&amp; (E != -1))
			{
				E = WSAWaitForMultipleEvents (maxHandle, e, false, WSA_INFINITE, false);
				WSAResetEvent (e[E - WSA_WAIT_EVENT_0]);
				switch (E - WSA_WAIT_EVENT_0)
					{
						case exitH:
							_endthread ();
							break;
						case sendH:
							E = recv (s, buf, l-1, NULL);
							if (E &lt; 1)
								{
									if (WSAGetLastError () == 10035)
										{
											E = -99;
										}
								}
							break;
					}
				if (E != -99)
					{
						WaitForSingleObject (DATA-&gt;isfree, INFINITE);
						while (E == WSAEMSGSIZE)
							{
								DATA-&gt;buffer += buf;
								memset(buf, 0, l);
								E = recv (s, buf, l-1, NULL);
							};
						DATA-&gt;buffer += buf;
						_beginthread (command, 0, (void *) DATA);
						SetEvent (DATA-&gt;isfree);
						memset (buf, 0, l);
					}
					else
						{
							Sleep (100);
						}
			};
		std::cout &lt;&lt; (signed __int32) s &lt;&lt; &quot;: disconnect&quot; &lt;&lt; std::endl;
		CloseHandle (DATA-&gt;isfree);
		delete DATA;
		_endthread();
	};
</code></pre>
<pre><code class="language-cpp">struct data
{
	SOCKET sock;
	std::string buffer;
	signed __int8 state;
	HANDLE isfree;
};
</code></pre>
<pre><code class="language-cpp">void command (void *DATA)
	{
		std::auto_ptr &lt;data&gt; D (static_cast &lt;data*&gt; (DATA));
		WaitForSingleObject (D-&gt;isfree, INFINITE);
		if (!D-&gt;buffer.empty ())
			{
				std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot; &quot; &lt;&lt; D-&gt;buffer &lt;&lt; std::endl;
			}
			else
				{
					std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot;: connect&quot; &lt;&lt; std::endl;
				}
		std::string tosend = &quot;&quot;;
//...
	if (!D-&gt;buffer.length ())
		{
			tosend = &quot;ichwerdegesendet&quot;;
			D-&gt;state = state_hell;
		}	else tosend = &quot;1&quot;;
D-&gt;buffer = &quot;&quot;;
		if (tosend.length () &gt; 1)
			{
				std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot; &gt; &quot; &lt;&lt; tosend &lt;&lt; std::endl;
				(void) send ((unsigned __int32) (D-&gt;sock), tosend.c_str() , tosend.length (), 0);
			}
		else if (tosend == &quot;1&quot;)
			{
				SetEvent (D-&gt;isfree);
				_endthread ();
			}
		SetEvent (D-&gt;isfree);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/197919/struct-geht-verloren-socket-threads</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 04:35:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/197919.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 16 Nov 2007 00:19:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to struct geht verloren (Socket, Threads) on Fri, 16 Nov 2007 00:25:26 GMT]]></title><description><![CDATA[<p>Ich weiß, dass es viel Quelltext ist und ich hab dazu noch wenig Angaben, wo genau der Fehler liegt - der Code is wahrscheinlich auch ein wenig unübersichtlich und zeigt, dass ich nicht der beste Programmierer bin - aber im thread waitforanswer wird der String richtig empfangen<br />
Beim ersten mal geht auch alles super im command-Thread, aber wenn der Thread zum zweiten mal startet, ist der Pointer auf einmal fehlerhaft (also ich bekomme keinen Zugriffsfehler, aber auf einmal sind völlig komische Werte in dem struct (DATA) - der Socket hat viel zu viele Stellen, der string buffer ist &quot;&quot;, der state ist -44 oder so was in der Richtung und das Handle isfree hat auch ne mehr, als eigenartige Adresse im Heap - zumindest lt. Debugger) - und ich finde den Fehler einfach nicht - wäre sehr dankbar über einen Tip.<br />
Danke schon mal...</p>
<pre><code class="language-cpp">#define maxHandle		2
#define exitH			0
#define sendH			1

typedef pair &lt;WSAEVENT*, SOCKET&gt; paar;

struct sthreads
	{
		vector &lt;paar&gt; handles;
		unsigned __int16 ceil;
		HANDLE isfree;
	};
</code></pre>
<pre><code class="language-cpp">void waitforanswer (void *threads)
	{
		std::auto_ptr &lt;sthreads&gt; D (static_cast &lt;sthreads*&gt; (threads));
		unsigned __int32 z = D-&gt;ceil;
		SOCKET s = D-&gt;handles[z].second;
		WSAEventSelect (s, D-&gt;handles[z].first[sendH], FD_READ);
		WSAEVENT e[maxHandle];
		e[exitH] = D-&gt;handles[z].first[exitH];
		e[sendH] = D-&gt;handles[z].first[sendH];
		SetEvent (D-&gt;isfree);
		data *DATA = new data;
		DATA-&gt;sock = s;
		DATA-&gt;isfree = CreateEvent (NULL, false, false, NULL);
		DATA-&gt;buffer = &quot;&quot;;
		DATA-&gt;state = state_empty;
		_beginthread (command, 0, (void *) DATA);
		SetEvent (DATA-&gt;isfree);
		char buf[l]; memset (buf, 0, l);
		signed __int32 E = 1;
		while ((E != 0) &amp;&amp; (E != -1))
			{
				E = WSAWaitForMultipleEvents (maxHandle, e, false, WSA_INFINITE, false);
				WSAResetEvent (e[E - WSA_WAIT_EVENT_0]);
				switch (E - WSA_WAIT_EVENT_0)
					{
						case exitH:
							_endthread ();
							break;
						case sendH:
							E = recv (s, buf, l-1, NULL);
							if (E &lt; 1)
								{
									if (WSAGetLastError () == 10035)
										{
											E = -99;
										}
								}
							break;
					}
				if (E != -99)
					{
						WaitForSingleObject (DATA-&gt;isfree, INFINITE);
						while (E == WSAEMSGSIZE)
							{
								DATA-&gt;buffer += buf;
								memset(buf, 0, l);
								E = recv (s, buf, l-1, NULL);
							};
						DATA-&gt;buffer += buf;
						_beginthread (command, 0, (void *) DATA);
						SetEvent (DATA-&gt;isfree);
						memset (buf, 0, l);
					}
					else
						{
							Sleep (100);
						}
			};
		std::cout &lt;&lt; (signed __int32) s &lt;&lt; &quot;: disconnect&quot; &lt;&lt; std::endl;
		CloseHandle (DATA-&gt;isfree);
		delete DATA;
		_endthread();
	};
</code></pre>
<pre><code class="language-cpp">struct data
{
	SOCKET sock;
	std::string buffer;
	signed __int8 state;
	HANDLE isfree;
};
</code></pre>
<pre><code class="language-cpp">void command (void *DATA)
	{
		std::auto_ptr &lt;data&gt; D (static_cast &lt;data*&gt; (DATA));
		WaitForSingleObject (D-&gt;isfree, INFINITE);
		if (!D-&gt;buffer.empty ())
			{
				std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot; &quot; &lt;&lt; D-&gt;buffer &lt;&lt; std::endl;
			}
			else
				{
					std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot;: connect&quot; &lt;&lt; std::endl;
				}
		std::string tosend = &quot;&quot;;
//...
	if (!D-&gt;buffer.length ())
		{
			tosend = &quot;ichwerdegesendet&quot;;
			D-&gt;state = state_hell;
		}	else tosend = &quot;1&quot;;
D-&gt;buffer = &quot;&quot;;
		if (tosend.length () &gt; 1)
			{
				std::cout &lt;&lt; (unsigned __int32) (D-&gt;sock) &lt;&lt; &quot; &gt; &quot; &lt;&lt; tosend &lt;&lt; std::endl;
				(void) send ((unsigned __int32) (D-&gt;sock), tosend.c_str() , tosend.length (), 0);
			}
		else if (tosend == &quot;1&quot;)
			{
				SetEvent (D-&gt;isfree);
				_endthread ();
			}
		SetEvent (D-&gt;isfree);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1404053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404053</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 16 Nov 2007 00:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to struct geht verloren (Socket, Threads) on Fri, 16 Nov 2007 04:01:32 GMT]]></title><description><![CDATA[<p>Hallo unskilled,</p>
<p>ich hab den Quelltext nur überflogen, aber wenn ich das jetzt richtig<br />
gesehen habe, übergibst du 2 mal das gleiche Objekt und wegen des</p>
<pre><code class="language-cpp">std::auto_ptr &lt;data&gt; D (static_cast &lt;data*&gt; (DATA));
</code></pre>
<p>wird deine Struktur nach verlassen des 1. Methodenaufruf gelöscht.<br />
Außerdem kannst du dich, da du einen neuen Thread startest nicht<br />
darauf verlassen, dass der Thread nicht erst nach dem</p>
<pre><code class="language-cpp">delete DATA;
</code></pre>
<p>(was zwar dahinter steht aber wegen des neuen Thread unwesentlich)<br />
auf das (nicht mehr vorhandene) Objekt zugreift.</p>
<p>Ich hab jetzt nicht gekuckt, ob die Schleife &quot;wegen der Logik&quot; nicht<br />
vorher verlassen werden kann. Aber ne potentielle Fehlerquelle.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404070</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 16 Nov 2007 04:01:32 GMT</pubDate></item><item><title><![CDATA[Reply to struct geht verloren (Socket, Threads) on Fri, 16 Nov 2007 15:32:13 GMT]]></title><description><![CDATA[<p>Danke erst mal : &gt;</p>
<ol>
<li></li>
</ol>
<p>CSpille schrieb:</p>
<blockquote>
<p>übergibst du 2 mal das gleiche Objekt und wegen des</p>
<pre><code class="language-cpp">std::auto_ptr &lt;data&gt; D (static_cast &lt;data*&gt; (DATA));
</code></pre>
<p>wird deine Struktur nach verlassen des 1. Methodenaufruf gelöscht.</p>
</blockquote>
<p>Und das kann ich wie verhindern?<br />
in dem ich jedes mal ((data*)DATA)-&gt;... schreibe oder gibts da auch noch ne bessere Variante?</p>
<ol start="2">
<li></li>
</ol>
<p>CSpille schrieb:</p>
<blockquote>
<p>Außerdem kannst du dich, da du einen neuen Thread startest nicht darauf verlassen, dass der Thread nicht erst nach dem</p>
<pre><code class="language-cpp">delete DATA;
</code></pre>
<p>(was zwar dahinter steht aber wegen des neuen Thread unwesentlich) auf das (nicht mehr vorhandene) Objekt zugreift.</p>
</blockquote>
<p>Ja, das muss ich noch ändern, aber der Thread wurde bisher noch nicht so beendet - also ne potentielle Fehlerquelle ist es, aber in dem Fall war es nicht der Fehler, da ich in der Schleife bleibe...</p>
<p>Tom</p>
<p>//edit: ich hab jz jedes mal ((data*)DATA)-&gt; bzw ((sthreads*)threads)-&gt; geschrieben und es geht wieder einwandfrei : &gt;<br />
Danke noch mal <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404492</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 16 Nov 2007 15:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to struct geht verloren (Socket, Threads) on Sat, 17 Nov 2007 03:40:36 GMT]]></title><description><![CDATA[<p>Hi unskilled,</p>
<p>warum castest du nicht einmal normal?</p>
<pre><code class="language-cpp">data* myData = static_cast &lt;data*&gt;(DATA);
</code></pre>
<p>bzw:</p>
<pre><code class="language-cpp">data&amp; myData = *static_cast &lt;data*&gt;(DATA);
</code></pre>
<p>und greifst anschließend mit myData-&gt; bzw. myData. über diesen Zeiger<br />
bzw. Referenz zu?</p>
<p>Gern geschehen...</p>
<p>Mir hat man hier auch schon oft genug geholfen <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>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404771</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 17 Nov 2007 03:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to struct geht verloren (Socket, Threads) on Sat, 17 Nov 2007 16:59:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">l-1
</code></pre>
<p>lol</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1404984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1404984</guid><dc:creator><![CDATA[-------]]></dc:creator><pubDate>Sat, 17 Nov 2007 16:59:22 GMT</pubDate></item></channel></rss>