<?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 in Thread ansprechen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin ziemlich neu hier im Forum und hoffe, dass mir hier jemand aus der patsche Helfen kann <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>Und zwar schreibe ich momenatn an einer kleinen Serverapplikation. Dazu reserviert mir das Programm einen Port und wartet dann auf Clients die sich verbinden.<br />
Wenn sich ein Client anmeldet wird ein ServerSocket-Objekt erzeugt, eine Struktur mit zusaetzlich ner Nummer gespeichert und ein Thread erzeugt, dem die Struktur dann als Argument uebergeben wird.<br />
Wenn ich den Server starte und mich z.B. per telnet verbinden will knallt es aber dann, ich kann nicht mal Daten senden!<br />
Das Ganze sieht in etwa so aus:<br />
Im Hauptprogramm:</p>
<pre><code class="language-cpp">#include &quot;communication.h&quot;
#include &quot;serversocket.h&quot;
#include &quot;socketexception.h&quot;
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;pthread.h&gt; 

struct cl_str {
	unsigned int client_num;
	ServerSocket *new_sock;
};

void* client_messages( void* );

int main ( int argc, char **argv )
{
	unsigned int client_num = 0;
	std::cout &lt;&lt; &quot;running....\n&quot;;

	try
	{
		// Create the socket
		ServerSocket server( PORT );

		while ( true )
		{
			ServerSocket new_sock; 
			server.accept( new_sock );
			client_num++;

			cl_str structure;
			structure.client_num = client_num;
			structure.new_sock = &amp;new_sock;

			pthread_t client_thread;
			pthread_create( &amp;client_thread, NULL, client_messages, &amp;structure );

			// pthread_join( client_thread, NULL ); 
		}
	}
	catch ( SocketException&amp; e )
	{
		std::cout &lt;&lt; &quot;Exception caught:&quot; &lt;&lt; e.description() 
					&lt;&lt; std::endl &lt;&lt; &quot;Exiting.&quot; &lt;&lt; std::endl;
	}
	return 0;
}

void* client_messages( void *client_struct )
{
	cl_str *cl = ((cl_str*)(client_struct));
	unsigned int num = (*cl).client_num;
	ServerSocket *new_sock = (*cl).new_sock;

	try
	{
		while ( true )
		{
			std::string data;
			(*new_sock) &gt;&gt; data;
			std::cout &lt;&lt; &quot;client &quot; &lt;&lt; num &lt;&lt; &quot;: &quot; &lt;&lt; data &lt;&lt; std::endl;
		}
	}
	catch ( SocketException&amp; se ) 
	{
		std::cout &lt;&lt; &quot;Exception getting client message!&quot; &lt;&lt; std::endl
					&lt;&lt; se.description() &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Zustaendig fuer das Senden/Empfangen der Daten ist die Klasse Socket, hier ein Auszug:</p>
<pre><code class="language-cpp">int 
Socket::recv ( std::string&amp; s ) const
{
	char buf [ MAXRECV + 1 ];
	s = &quot;&quot;;

	memset ( buf, 0, MAXRECV + 1 );

	int status = ::recv ( m_sock, buf, MAXRECV, 0 );

	if ( status == -1 )
	{
		std::cout &lt;&lt; &quot;STATUS == -1   ERRNO == &quot; &lt;&lt; errno &lt;&lt; &quot;  in Socket::recv\n&quot;;
		return 0;
	}
	else if ( status == 0 )
	{
		return 0;
	}
	else
	{
		s = buf;
		return status;
	}
}
</code></pre>
<p>Wenn ich in der Schleife im Hauptprogramm auf den Thread warte dann funktioniert alles einwandfrei, ich kann aber nicht mehrere Clients akzeptieren, und darum geht es mir!<br />
Kann mir da jemand einen Tipp geben was ich falsch mache? Sitz seit ca. 2 Stunden und bin am experimentieren, finde aber keine Loesung <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>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124089/sockets-in-thread-ansprechen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 20:17:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124089.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Oct 2005 16:05:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 16:05:22 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich bin ziemlich neu hier im Forum und hoffe, dass mir hier jemand aus der patsche Helfen kann <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>Und zwar schreibe ich momenatn an einer kleinen Serverapplikation. Dazu reserviert mir das Programm einen Port und wartet dann auf Clients die sich verbinden.<br />
Wenn sich ein Client anmeldet wird ein ServerSocket-Objekt erzeugt, eine Struktur mit zusaetzlich ner Nummer gespeichert und ein Thread erzeugt, dem die Struktur dann als Argument uebergeben wird.<br />
Wenn ich den Server starte und mich z.B. per telnet verbinden will knallt es aber dann, ich kann nicht mal Daten senden!<br />
Das Ganze sieht in etwa so aus:<br />
Im Hauptprogramm:</p>
<pre><code class="language-cpp">#include &quot;communication.h&quot;
#include &quot;serversocket.h&quot;
#include &quot;socketexception.h&quot;
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;pthread.h&gt; 

struct cl_str {
	unsigned int client_num;
	ServerSocket *new_sock;
};

void* client_messages( void* );

int main ( int argc, char **argv )
{
	unsigned int client_num = 0;
	std::cout &lt;&lt; &quot;running....\n&quot;;

	try
	{
		// Create the socket
		ServerSocket server( PORT );

		while ( true )
		{
			ServerSocket new_sock; 
			server.accept( new_sock );
			client_num++;

			cl_str structure;
			structure.client_num = client_num;
			structure.new_sock = &amp;new_sock;

			pthread_t client_thread;
			pthread_create( &amp;client_thread, NULL, client_messages, &amp;structure );

			// pthread_join( client_thread, NULL ); 
		}
	}
	catch ( SocketException&amp; e )
	{
		std::cout &lt;&lt; &quot;Exception caught:&quot; &lt;&lt; e.description() 
					&lt;&lt; std::endl &lt;&lt; &quot;Exiting.&quot; &lt;&lt; std::endl;
	}
	return 0;
}

void* client_messages( void *client_struct )
{
	cl_str *cl = ((cl_str*)(client_struct));
	unsigned int num = (*cl).client_num;
	ServerSocket *new_sock = (*cl).new_sock;

	try
	{
		while ( true )
		{
			std::string data;
			(*new_sock) &gt;&gt; data;
			std::cout &lt;&lt; &quot;client &quot; &lt;&lt; num &lt;&lt; &quot;: &quot; &lt;&lt; data &lt;&lt; std::endl;
		}
	}
	catch ( SocketException&amp; se ) 
	{
		std::cout &lt;&lt; &quot;Exception getting client message!&quot; &lt;&lt; std::endl
					&lt;&lt; se.description() &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Zustaendig fuer das Senden/Empfangen der Daten ist die Klasse Socket, hier ein Auszug:</p>
<pre><code class="language-cpp">int 
Socket::recv ( std::string&amp; s ) const
{
	char buf [ MAXRECV + 1 ];
	s = &quot;&quot;;

	memset ( buf, 0, MAXRECV + 1 );

	int status = ::recv ( m_sock, buf, MAXRECV, 0 );

	if ( status == -1 )
	{
		std::cout &lt;&lt; &quot;STATUS == -1   ERRNO == &quot; &lt;&lt; errno &lt;&lt; &quot;  in Socket::recv\n&quot;;
		return 0;
	}
	else if ( status == 0 )
	{
		return 0;
	}
	else
	{
		s = buf;
		return status;
	}
}
</code></pre>
<p>Wenn ich in der Schleife im Hauptprogramm auf den Thread warte dann funktioniert alles einwandfrei, ich kann aber nicht mehrere Clients akzeptieren, und darum geht es mir!<br />
Kann mir da jemand einen Tipp geben was ich falsch mache? Sitz seit ca. 2 Stunden und bin am experimentieren, finde aber keine Loesung <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>
<p>mfg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899415</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sun, 23 Oct 2005 16:05:22 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:00:48 GMT]]></title><description><![CDATA[<p>Ok, auf die Ursache bin ich gekommen. Anscheinend wird der Destruktor von Socket aufgerufen und zerstoert das Objekt bevor es ueberhaupt in den Thread gelangen kann - aber wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899535</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:00:48 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:04:02 GMT]]></title><description><![CDATA[<p>moe szyslak schrieb:</p>
<blockquote>
<p>aber wieso?</p>
</blockquote>
<p>Wieso nicht?</p>
<p>server ist eine lokale Variable innerhalb des try-Blocks. Wenn das Programm diesen Block verlässt, wird server wie alle anderen lokalen Variablen auch zerstört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899537</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:04:02 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:08:11 GMT]]></title><description><![CDATA[<p>server ist nicht betroffen vom destruktor sondern new_sock, und das Programm bleibt auch immer in der while-Schleife, das heisst es verlaesst sie nicht, trotzdem wird new_sock zerstoert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899545</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899545</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:08:11 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:12:28 GMT]]></title><description><![CDATA[<p>moe szyslak schrieb:</p>
<blockquote>
<p>server ist nicht betroffen vom destruktor sondern new_sock,</p>
</blockquote>
<p>Und new_sock ist eine lokale Variable im Schleifenkörper, und wird daher nach jedem Schleifendurchlauf zerstört. Gleiches Prinzip.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899551</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:12:28 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:19:50 GMT]]></title><description><![CDATA[<p>MFK schrieb:</p>
<blockquote>
<p>moe szyslak schrieb:</p>
<blockquote>
<p>server ist nicht betroffen vom destruktor sondern new_sock,</p>
</blockquote>
<p>Und new_sock ist eine lokale Variable im Schleifenkörper, und wird daher nach jedem Schleifendurchlauf zerstört. Gleiches Prinzip.</p>
</blockquote>
<p>Ist klar, jetzt klappts auch, und zwar sieht das jetzt so aus:</p>
<pre><code class="language-cpp">#include &quot;communication.h&quot;
#include &quot;clientlist.h&quot;;
#include &quot;serversocket.h&quot;
#include &quot;socketexception.h&quot;
#include &lt;string&gt;
#include &lt;iostream&gt;
#include &lt;pthread.h&gt; 

struct cl_str {
	unsigned int client_num;
	ServerSocket *new_sock;
};

void* client_messages( void* );

int main ( int argc, char **argv )
{
	unsigned int client_num = 0;
	Clientlist clients;
	ServerSocket *new_sock;

	std::cout &lt;&lt; &quot;running....\n&quot;;

	try
	{
		// Create the socket
		ServerSocket server( PORT );
		pthread_t client_thread;

		while ( true )
		{
			new_sock = new ServerSocket();
			server.accept( *new_sock );

			// ServerSocket new_sock; 
			// server.accept( new_sock );
			client_num++;

			clients.add_client( *new_sock, &quot;client mac&quot;, &quot;client name&quot; );

			cl_str structure;
			structure.client_num = client_num;
			structure.new_sock = new_sock;

			pthread_create( &amp;client_thread, NULL, client_messages, &amp;structure ); 
		}
		pthread_join( client_thread, NULL ); 
	}
	catch ( SocketException&amp; e )
	{
		std::cout &lt;&lt; &quot;Exception was caught:&quot; &lt;&lt; e.description() 
					&lt;&lt; std::endl &lt;&lt; &quot;Exiting.&quot; &lt;&lt; std::endl;
	}
	return 0;
}

void* client_messages( void *client_struct )
{
	cl_str *cl = ((cl_str*)(client_struct));
	unsigned int num = (*cl).client_num;
	ServerSocket *new_sock = (*cl).new_sock;

	try
	{
		while ( true )
		{
			std::string data;
			(*new_sock) &gt;&gt; data;
			std::cout &lt;&lt; &quot;client &quot; &lt;&lt; num &lt;&lt; &quot;: &quot; &lt;&lt; data &lt;&lt; std::endl;
		}
	}
	catch ( SocketException&amp; se ) 
	{
		std::cout &lt;&lt; &quot;Exception getting client message!&quot; &lt;&lt; std::endl
					&lt;&lt; se.description() &lt;&lt; std::endl;
	}
	return 0;
}
</code></pre>
<p>Eigentlich sollte man das ja selber wissen, aber nachdem man 3 Jahre lang fast ausschliesslich mit Java arbeitet wird man halt doch wein wenig denkfaul <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>
<p>Danke!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899556</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:19:50 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 19:33:21 GMT]]></title><description><![CDATA[<p>Das ist immer noch nicht sicher, weil du immer noch die Adresse einer lokalen Variablen übergibst. Im Prinzip übergibst du immer wieder dieselbe Adresse. Da diese Variable keine Daten enthält, die Destruktoren haben, wird das meistens gutgehen. Aber wenn sich zwei Clients in kurzer Zeit verbinden, kann es passieren, dass beide Threads die Informationen des zweiten Clients auslesen. Entweder bringst du da eine Synchronisierung rein, oder du legst die Struktur auf dem Heap an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899568</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Sun, 23 Oct 2005 19:33:21 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 20:03:01 GMT]]></title><description><![CDATA[<p>Mit in den Heap legen, meinst du dabei so was [1]<br />
Was wuerdest du sagen ist aus Performencegruenden besser? Hab die Moeglichkeit mit dem Heap noch nie benutzt!</p>
<p>[1] <a href="http://www.cppreference.com/cppalgorithm/make_heap.html" rel="nofollow">http://www.cppreference.com/cppalgorithm/make_heap.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/899589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899589</guid><dc:creator><![CDATA[moe szyslak]]></dc:creator><pubDate>Sun, 23 Oct 2005 20:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 20:21:12 GMT]]></title><description><![CDATA[<p>Nein, meint er nicht. Er mein &quot;free store&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899611</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Sun, 23 Oct 2005 20:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to Sockets in Thread ansprechen on Sun, 23 Oct 2005 20:26:03 GMT]]></title><description><![CDATA[<p>moe szyslak schrieb:</p>
<blockquote>
<p>Mit in den Heap legen, meinst du dabei so was [1]<br />
Was wuerdest du sagen ist aus Performencegruenden besser? Hab die Moeglichkeit mit dem Heap noch nie benutzt!</p>
</blockquote>
<p>&quot;Premature optimization is the root of all evil.&quot;</p>
<p>mit heap meint er das hier:</p>
<pre><code class="language-cpp">int* ptr = new int;
// ... 
delete ptr;
</code></pre>
<p>ansonsten würde ich mir bei c++ erstmal keine gedanken um performance machen. (das sage ich nicht nur, weil du vorher in java programmiert hast)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899618</guid><dc:creator><![CDATA[terraner]]></dc:creator><pubDate>Sun, 23 Oct 2005 20:26:03 GMT</pubDate></item></channel></rss>