<?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[Client macht schlapp bei &#x27;&#x5C;n&#x27;]]></title><description><![CDATA[<p>Huhu (:</p>
<p>Ich schreibe grade an einem Chat.<br />
Verbindung wird hergestellt...<br />
Jedoch wenn ich dann &quot;aus versehen&quot; '\n' bzw. nichts eingebe. Kackt mein Client ab.<br />
Eine Abfrage wollte ich machen, aber dann meckert der Compiler rum, dass ich:</p>
<pre><code class="language-cpp">if( str == '\n' )
    //...
</code></pre>
<p>nicht verwenden darf.<br />
Gibt es eine Funktion mit der ich, dass verhindern kann (Damit der Client nicht abstürzt)</p>
<p>Ich verwende zum Einlesen das hier:</p>
<pre><code class="language-cpp">std::string s;
			std::cout &lt;&lt; &quot;Nachricht an den Server: &quot;;
			while ( /* don´t know */ )
				std::getline ( std::cin, s, '\n' );
</code></pre>
<p>Ich bedanke mich mal im voraus!</p>
<p>lG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251142/client-macht-schlapp-bei-n</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 17:05:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251142.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Sep 2009 18:03:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 18:03:21 GMT]]></title><description><![CDATA[<p>Huhu (:</p>
<p>Ich schreibe grade an einem Chat.<br />
Verbindung wird hergestellt...<br />
Jedoch wenn ich dann &quot;aus versehen&quot; '\n' bzw. nichts eingebe. Kackt mein Client ab.<br />
Eine Abfrage wollte ich machen, aber dann meckert der Compiler rum, dass ich:</p>
<pre><code class="language-cpp">if( str == '\n' )
    //...
</code></pre>
<p>nicht verwenden darf.<br />
Gibt es eine Funktion mit der ich, dass verhindern kann (Damit der Client nicht abstürzt)</p>
<p>Ich verwende zum Einlesen das hier:</p>
<pre><code class="language-cpp">std::string s;
			std::cout &lt;&lt; &quot;Nachricht an den Server: &quot;;
			while ( /* don´t know */ )
				std::getline ( std::cin, s, '\n' );
</code></pre>
<p>Ich bedanke mich mal im voraus!</p>
<p>lG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786176</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 29 Sep 2009 18:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 18:11:21 GMT]]></title><description><![CDATA[<p><code>std::string</code> hat keinen <code>operator==</code> mit einem char-Operanden^^<br />
Dann guck halt nach<br />
<code>msg == &quot;\r\n&quot; || msg == &quot;\n&quot;</code><br />
allerdings bin ich ein wenig verwundert, wieso es einen Fehler geben sollte, wenn der Client nur nen Zeilenumbruch schickt...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786181</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 29 Sep 2009 18:11:21 GMT</pubDate></item><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 20:06:29 GMT]]></title><description><![CDATA[<p>Huhu</p>
<p>mich wundert´s auch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /><br />
Es funktioniert noch immer nicht...<br />
Ich bin echt am verzweifeln.<br />
Er macht keine Fehlermeldung, sondern blockiert den nächsten Durchgang.</p>
<p>Was mir so spontan einfällt ist, dass noch was im Puffer liegt...</p>
<p>Liege ich damit richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786234</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786234</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 29 Sep 2009 20:06:29 GMT</pubDate></item><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 20:45:20 GMT]]></title><description><![CDATA[<p>Würd ich nicht sagen - aber dummerweise hab ich ja keinen Code davon ;P<br />
Also zeig mal bitte, wie der Server empfängt...</p>
<p>btw:<br />
dir ist bewusst, dass der letzte parameter unnötig ist:<br />
<code>std::getline ( std::cin, s, '\n' );</code><br />
-&gt;<br />
<code>std::getline(std::cin, s);</code></p>
<p>s ist auch nicht gerade nen schöner variablenname...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786241</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786241</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 29 Sep 2009 20:45:20 GMT</pubDate></item><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 21:13:02 GMT]]></title><description><![CDATA[<p>Okey (:</p>
<p>Hier ist die Funktion für das<br />
EMPFANGEN - SERVER:</p>
<pre><code class="language-cpp">int Socket::TCP_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 &gt; 0 || status != SOCKET_ERROR )
	{
		s = buf;
		return status;
	}
	else
	{
		throw SockExcept( &quot;Fehler in Socket::recv&quot; );
		return 0;
	}
}
</code></pre>
<p>Um das Problem nochmal klarzustellen:</p>
<pre><code>Client: &quot;Hallo&quot;
Server: &quot;Hallo&quot; empfangen
Client: &quot;...&quot;
Server: &quot;...&quot; empfangen
Client: \n
STOP, Client sendet nichts an den Server sondern Client bleibt hängen und blockiert die nächste Eingabe:
</code></pre>
<p>SENDEN - CLIENT</p>
<pre><code class="language-cpp">bool Socket::TCP_send(const std::string s ) 
const {
	int status = ::send ( m_sock, s.c_str(), s.size(), 0 );
	if ( status == -1 )
		return false;
	else
		return true;
}
</code></pre>
<p>Danke für deine Hilfe!</p>
<p><strong>€dit: Grade noch einen kleinen Test gemacht:</strong></p>
<pre><code class="language-cpp">int main( )
{
	std::string ip;
	std::cout &lt;&lt; &quot;Gib die IP-Adresse ein: &quot;;
	std::getline ( std::cin, ip, '\n' );
	while ( true ) 
	{
		try
		{
			ClientSock client_socket (ip, 12345 );
			std::string s;
			std::cout &lt;&lt; &quot;Nachricht an den Server: &quot;;
			std::getline ( std::cin, s );
			std::cout &lt;&lt; &quot;Bin durch&quot; &lt;&lt; std::endl;
			try
			{
				client_socket &lt;&lt; s;   //send 
				client_socket &gt;&gt; s;   //recv
				std::cout &lt;&lt; s &lt;&lt; std::endl;
			}
			catch ( SockExcept&amp; ) {}
			client_socket.close();
		}
		catch ( SockExcept&amp; e ) 
		{
			std::cout &lt;&lt; &quot;Ein Exception wurde abgefangen: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; std::endl;
		}
	}
	return 0;
}
</code></pre>
<p>Wenn ich:</p>
<p>**```<br />
Client: &quot;Test&quot;<br />
Bin durch<br />
Server: &quot;Test&quot; empfangen<br />
Client &quot;Nocheiner&quot;<br />
Bin durch<br />
Server: &quot;Nocheiner&quot; empfangen<br />
Client: \n<br />
Bin durch<br />
[ SERVER BEKOMMT NICHTS ]</p>
<pre><code>
Und beim inneren Try-Block bleibt er hängen.**  

lG</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1786246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786246</guid><dc:creator><![CDATA[Mentras]]></dc:creator><pubDate>Tue, 29 Sep 2009 21:13:02 GMT</pubDate></item><item><title><![CDATA[Reply to Client macht schlapp bei &#x27;&#x5C;n&#x27; on Tue, 29 Sep 2009 21:58:09 GMT]]></title><description><![CDATA[<p>das Server-Emfpangen hatten wir doch vor kurzem schon mal in nem anderen Thread, richtig?!</p>
<pre><code class="language-cpp">int Socket::TCP_recv(std::string&amp; s) const
{
	char buf[MAXRECV];
	int status = ::recv(m_sock, buf, MAXRECV, 0);
	if(status != SOCKET_ERROR)
	{
		s = std::string(buf, buf+status);
		return status;
	} 
	else 
	{ 
		throw SockExcept( &quot;Fehler in Socket::recv&quot; ); 
		return 0; //unreachable code
	}
}

-&gt;

std::string Socket::TCP_recv()
{
	char buf[MAXRECV];
	int status = ::recv(m_sock, buf, MAXRECV, 0);

	if(status == SOCKET_ERROR)
		throw SockExcept( &quot;Fehler in Socket::recv&quot; ); 

	return std::string(buf, buf+status);
}

/* Anwendung:
std::string rcv = socket_instanz.TCP_recv();
*/
</code></pre>
<p>das const hab ich auch mit absicht weggemacht - eine methode sollte nur const sein, wenn sie beliebig oft ausführen kann und sich der status des objekts dadurch nicht ändert...</p>
<p>das Senden:</p>
<pre><code class="language-cpp">void Socket::TCP_send(std::string &amp;s)
{
	int status = ::send(m_sock, s.c_str(), s.size(), 0);
	if(status == SOCKET_ERROR)
		throw SockExcept(&quot;Fehler in Socket::send&quot;);

	s.erase(s.begin(), s.begin()+status);
}
/* Anwendung:
std::string to_send = &quot;asdasd&quot;;

while(! to_send.empty())
{
  socket_instanz.TCP_send(to_send);
};
*/
</code></pre>
<p>bb</p>
<p>PS: Zum eigtl Problem:<br />
<code>std::getline</code><br />
kopiert alle zeichen vom anfang bis zum ersten zeilenumbruch(oder anderem angegebenem Zeichen) in den output_string. Das angegebene Zeichen ist das erste, was _nicht_ mehr mitkopiert wird aber das letzte, was aus dem stream entfernt(als gelesen markierte) wurde...</p>
<p>es gibt also auch nichts zu senden - der Aufruf wird so in etwa aussehen:</p>
<pre><code class="language-cpp">send(socket, nullptr, 0, 0);
</code></pre>
<p>sieht mir nach implementation-defined Verhalten aus - je nach dem, wie send implementiert ist entweder undefined oder send kehrt direkt wieder zurück, ohne was gemacht zu haben - gab ja auch nichts zu senden...</p>
<p>also implementieren wir das senden an sich einfach so:</p>
<pre><code class="language-cpp">const char the_endl_char='\n';

std::string to_send;
std::getline(std::cin, to_send, the_endl_char);
to_send.push_back(the_endl_char);

//to_send senden
</code></pre>
<p>hier ists güt möglich, dass es nen schöneren/besseren weg gibt<br />
vll mit <code>unget</code> und <code>get</code> oder so - kann ich nicht beurteilen - ich würds aber mit der konstante machen^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1786263</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1786263</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 29 Sep 2009 21:58:09 GMT</pubDate></item></channel></rss>