<?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[Sehr merkwürdiges Problem mit nem Zeiger]]></title><description><![CDATA[<p>Hi,<br />
ich schreibe grade unter Linux einen Server basierend auf C++ und Sockets. Habe ein sehr merkwürdiges Problem, denn mein Client verliert auf einmal die Verbindung und ich weiß nicht warum.<br />
Vielleicht poste ich erstmal code:</p>
<p>Hier in diesem Code tritt der Fehler auf. Erklärung folgt weiter unten.</p>
<pre><code>void *CClient::Handle()
{
	log-&gt;Print(&quot;Client verbunden\n&quot;);
	s-&gt;Send(&quot;Willkommen auf dem Linux Remote Manager - Server\n&quot;,sender);
	bool status = true;
	char *buffer;
	while(status == true)
	{
		//memset(buffer,0,strlen(buffer));
		buffer = NULL;
		buffer = s-&gt;Recv(sender);

		if(strcmp(buffer,&quot;&quot;) == 0)
		{
			status = false;
			log-&gt;Print(&quot;Client disconnected\n&quot;);
			s-&gt;Close(sender);
			pthread_exit(NULL);
		}
		else
		{
			//log-&gt;Print(buffer);
			Parse(buffer);
		}
	}
}

void CClient::Parse(char *text)
{
	if(strspn(text,&quot;LOGIN&quot;) &gt;= 0)
	{
		char *buf = text;
		Login(buf);
	}
	else if(strspn(text,&quot;LOGOUT&quot;) &gt;= 0)
	{
		this-&gt;Logout();

	}
}

int CClient::Login(char *text)
{
	printf(&quot;jehaa\n&quot;);

	return 0;
}
</code></pre>
<p>Hier nun die Socket Methoden</p>
<pre><code>int CSocket::Send(char *text,int sender)
{
	long rc = send(sender,text,strlen(text),0);
	if(rc == -1)
	{
		log-&gt;Print(&quot;Fehler beim senden\n&quot;);
		return 0;
	}
	else
		return 1;
}

char *CSocket::Recv(int sender)
{
	char *buffer = new char[1024];
	memset(buffer,strlen(buffer),0);
	string sbuffer;
	char c;
	int bytes;

	while(c != '\n')
	{
		bytes = recv(sender,&amp;c,1,0);

		if(bytes&lt;=0)
		{
			return &quot;&quot;;
		}
		else
		{	
			sbuffer += c;
		}
	}
	strcpy(buffer,sbuffer.c_str());
	return buffer;
}

void CSocket::Parse(char *line,char *Params[])
{
	int i;
	for(i=0;i&lt; 20;i++)
	{
		while(*line &amp;&amp; isspace(*line))
			line++;
		Params[i] = line;
		while(*line &amp;&amp; !isspace(*line))
			line++;
		if(*line)
			*(line++) = '\0';
	}
}
</code></pre>
<p>Also zur Erklärung: Der Client wird vom Server gekickt, wenn ich die Parse Methode aus der Handle() Methode aufrufe. Ich weiß nciht warum, ich gebe den Pointer ja eigentlich nur weiter und gebe ihn dann aus.<br />
Mach ich die if Abfrage raus, geht es wunderbar. Muss also irgendwie an der parse geschichte liegen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Achso, der Server basiert auf Threads. Jeder Client bekommt nen extra Thread.</p>
<p>Hoffe ihr könnt mir helfen..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/125979/sehr-merkwürdiges-problem-mit-nem-zeiger</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 19:58:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/125979.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Nov 2005 20:49:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Sehr merkwürdiges Problem mit nem Zeiger on Thu, 10 Nov 2005 20:49:23 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich schreibe grade unter Linux einen Server basierend auf C++ und Sockets. Habe ein sehr merkwürdiges Problem, denn mein Client verliert auf einmal die Verbindung und ich weiß nicht warum.<br />
Vielleicht poste ich erstmal code:</p>
<p>Hier in diesem Code tritt der Fehler auf. Erklärung folgt weiter unten.</p>
<pre><code>void *CClient::Handle()
{
	log-&gt;Print(&quot;Client verbunden\n&quot;);
	s-&gt;Send(&quot;Willkommen auf dem Linux Remote Manager - Server\n&quot;,sender);
	bool status = true;
	char *buffer;
	while(status == true)
	{
		//memset(buffer,0,strlen(buffer));
		buffer = NULL;
		buffer = s-&gt;Recv(sender);

		if(strcmp(buffer,&quot;&quot;) == 0)
		{
			status = false;
			log-&gt;Print(&quot;Client disconnected\n&quot;);
			s-&gt;Close(sender);
			pthread_exit(NULL);
		}
		else
		{
			//log-&gt;Print(buffer);
			Parse(buffer);
		}
	}
}

void CClient::Parse(char *text)
{
	if(strspn(text,&quot;LOGIN&quot;) &gt;= 0)
	{
		char *buf = text;
		Login(buf);
	}
	else if(strspn(text,&quot;LOGOUT&quot;) &gt;= 0)
	{
		this-&gt;Logout();

	}
}

int CClient::Login(char *text)
{
	printf(&quot;jehaa\n&quot;);

	return 0;
}
</code></pre>
<p>Hier nun die Socket Methoden</p>
<pre><code>int CSocket::Send(char *text,int sender)
{
	long rc = send(sender,text,strlen(text),0);
	if(rc == -1)
	{
		log-&gt;Print(&quot;Fehler beim senden\n&quot;);
		return 0;
	}
	else
		return 1;
}

char *CSocket::Recv(int sender)
{
	char *buffer = new char[1024];
	memset(buffer,strlen(buffer),0);
	string sbuffer;
	char c;
	int bytes;

	while(c != '\n')
	{
		bytes = recv(sender,&amp;c,1,0);

		if(bytes&lt;=0)
		{
			return &quot;&quot;;
		}
		else
		{	
			sbuffer += c;
		}
	}
	strcpy(buffer,sbuffer.c_str());
	return buffer;
}

void CSocket::Parse(char *line,char *Params[])
{
	int i;
	for(i=0;i&lt; 20;i++)
	{
		while(*line &amp;&amp; isspace(*line))
			line++;
		Params[i] = line;
		while(*line &amp;&amp; !isspace(*line))
			line++;
		if(*line)
			*(line++) = '\0';
	}
}
</code></pre>
<p>Also zur Erklärung: Der Client wird vom Server gekickt, wenn ich die Parse Methode aus der Handle() Methode aufrufe. Ich weiß nciht warum, ich gebe den Pointer ja eigentlich nur weiter und gebe ihn dann aus.<br />
Mach ich die if Abfrage raus, geht es wunderbar. Muss also irgendwie an der parse geschichte liegen... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Achso, der Server basiert auf Threads. Jeder Client bekommt nen extra Thread.</p>
<p>Hoffe ihr könnt mir helfen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914374</guid><dc:creator><![CDATA[snoopdog]]></dc:creator><pubDate>Thu, 10 Nov 2005 20:49:23 GMT</pubDate></item><item><title><![CDATA[Reply to Sehr merkwürdiges Problem mit nem Zeiger on Thu, 10 Nov 2005 20:57:17 GMT]]></title><description><![CDATA[<p>debug mal diesen Abschnitt hier und sieh nach welchen Wert der text Parameter hat</p>
<pre><code class="language-cpp">void CClient::Parse(char *text)
{
    if(strspn(text,&quot;LOGIN&quot;) &gt;= 0)
    {
        char *buf = text;
        Login(buf);
    }
    else if(strspn(text,&quot;LOGOUT&quot;) &gt;= 0)
    {
        this-&gt;Logout();

    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/914382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914382</guid><dc:creator><![CDATA[leo aka qsch]]></dc:creator><pubDate>Thu, 10 Nov 2005 20:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to Sehr merkwürdiges Problem mit nem Zeiger on Thu, 10 Nov 2005 21:33:52 GMT]]></title><description><![CDATA[<p>wollte nur das kurz anhängen</p>
<pre><code>int CClient::Parse(char *text)
{
	//printf(text);
	char hs[10];
	//s-&gt;Parse(text,Pa);
	//printf(Pa[0]);
	return 0;
}
</code></pre>
<p>Das merkwürdige.. schreibe ich nur ein printf(text); da hin, wird er ordnungsgemäß ausgegeben. Mach ich es aber so wie da oben, also ich allokiere mir eine char array [10]; dann wird mein client trotzdem gekickt. Der server läuft aber einwandfrei weiter, kann mich auch wieder verbinden. Ist doch sehr merkwürdig oder ??</p>
<p>[edit]</p>
<p>Hab das jetzt mal debugt und mir die Ausgabe von text und hs ausgeben. Hier gdb:</p>
<blockquote>
<p>gdb) print text<br />
$1 = 0x8052658 &quot;LOGIN ba\r\n&quot;<br />
(gdb) print hs<br />
$2 = &quot;\n\000\000\000@¨\004\b1&quot;</p>
</blockquote>
<p>Scheint ja soweit alles ok zu sein, oder ?<br />
[/edit]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914415</guid><dc:creator><![CDATA[snoopdog]]></dc:creator><pubDate>Thu, 10 Nov 2005 21:33:52 GMT</pubDate></item><item><title><![CDATA[Reply to Sehr merkwürdiges Problem mit nem Zeiger on Fri, 11 Nov 2005 10:05:32 GMT]]></title><description><![CDATA[<p>hat denn noch wer ne idee? Nur nen Ansatz würd ja evtl schon reichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/914780</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/914780</guid><dc:creator><![CDATA[snoopdog]]></dc:creator><pubDate>Fri, 11 Nov 2005 10:05:32 GMT</pubDate></item><item><title><![CDATA[Reply to Sehr merkwürdiges Problem mit nem Zeiger on Fri, 11 Nov 2005 12:38:22 GMT]]></title><description><![CDATA[<p>So ich habs rausgefunden.<br />
Der Fehler lag in der CSocket::Recv. Genaugenommen am char c; Hab vergessen es zu initialisieren, so wurde beim zweiten Aufruf der Methode Recv der variabel c die gleiche Speicherstelle zugewiesen, wie beim letzten aufruf, somit stand wieder \n drin. Dadurch wurd die while Schleife übersprungen und der Client ordnungsgemäß beendet <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/915011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/915011</guid><dc:creator><![CDATA[snoopdog]]></dc:creator><pubDate>Fri, 11 Nov 2005 12:38:22 GMT</pubDate></item></channel></rss>