<?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[[C++&#x2F;Linux] Client&#x2F;Server Anwendung in einem Programm ???]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte eine Server/Client Geschichte aufbauen. Code in C++.<br />
Als Grundlage habe ich das Buch von Jürgen Wolf C++ A-Z hier liegen und<br />
die Beispiele zum Thema mal ausprobiert, leider komme ich aber nicht weiter.<br />
Laufen soll das ganze unter Linux.</p>
<p>Wie soll das ganze aussehen.</p>
<p>Programm 1:<br />
1. Programm 1 soll als Client auf einen Server (Programm 3) warten,<br />
der hin und wieder einen String schickt.<br />
2. Programm 1 soll aber auch ein Server sein und mindests einen Client<br />
(Programm 2) bedienen können, der Steuercodes an Programm 1 schickt.</p>
<p>Programm 2:<br />
Client-Anwendung die Steuercodes an Programm 1 schickt.</p>
<p>Programm 3:<br />
Server-Anwendung die einen String an Programm 1 schickt.</p>
<p>Ich habe mir den code multi_server.cpp von J.Wolf angeschaut und dort einfach<br />
echo_client.cpp mit eingebaut, leider klappt das net so gut, ich kann jeder<br />
Anwendung für sich benutzen (also Programm 1 ist entweder Client oder Server)<br />
aber beides zusammen bekomme ich net hin. Hab Ihr ein paar Tipps für mich,<br />
damit ich irgendwie weiter komme?</p>
<p>Ich habe die Dateien mal nicht alle mitangehängt, weil es doch schon einige sind, ich würde die Dateien auf Anfrage einfach per PM verschicken und das fertige Ergebnis dann hier posten. Wenn das ok wäre.</p>
<p>Folgend nur der Code von multi_server.cpp (angepasst)</p>
<pre><code>// multi_server.cpp
#include &quot;socket.h&quot;
#include &lt;iostream&gt;
using namespace std;

int main() {

	// ab hier client daemon code
	int len = 0;
	string fritzboxIP = &quot;127.0.0.1&quot;;
	long fritzboxPort = 15001;

	Socket dm_client;
	dm_client.create();
	dm_client.connect( fritzboxIP, fritzboxPort );
	dm_client.fcntl();
	int mydm_client = dm_client.get_m_sock();

	string c;

	int i, ready, sock_max, max=-1;
	int client_sock[FD_SETSIZE];
	fd_set gesamt_sock, lese_sock;

	try 
	{
		Socket sock1, sock2, sock3;
		sock1.create();
		sock1.bind(15000);
		sock1.listen();
		sock_max = sock1.get_m_sock();

		for(i=0; i&lt;FD_SETSIZE; i++)
			client_sock[i]=-1;

		FD_ZERO(&amp;gesamt_sock);
		FD_SET(sock1.get_m_sock(), &amp;gesamt_sock);

		for (;;) 
		{
			// ab hier warten auf den fritzbox-server
			dm_client.recvNOWait( c );
			len = c.size();
			if (c == &quot;exit&quot;) break;
			if (len &gt; 0) 
			{
				cout &lt;&lt; &quot;Nachricht vom fritzbox: &quot; &lt;&lt; c &lt;&lt; endl;
			}

			// Immer Aktualisieren
			lese_sock = gesamt_sock;
			// Hier wird auf die Ankunft von Daten oder neuer Verbindungen von Clients gewartet
			ready = select( sock_max+1, &amp;lese_sock,NULL, NULL, NULL );
			// Eine neue Client-Verbindung ... ?
			if( FD_ISSET(sock1.get_m_sock(), &amp;lese_sock)) 
			{
				sock1.accept(sock2);
				// Freien Platz f�r (Socket-)Deskriptor in client_sock suchen und vergeben 
				for( i=0; i&lt; FD_SETSIZE; i++)
					if(client_sock[i] &lt; 0) 
					{
						client_sock[i] = sock2.get_m_sock();
						break;
					}

				// Mehr als FD_SETSIZE Client sind nicht m�glich        
				if( i == FD_SETSIZE )
					throw SockExcept(&quot;Server �berlastet - zuviele Clients&quot;);

				// Den neuen (Socket-)Deskriptor zur (Gesamt)Menge hinzuf�gen
				FD_SET(sock2.get_m_sock(), &amp;gesamt_sock);

				// select() ben�tigt die h�chste (Socket-)Deskriptor-Nummer
				if( sock2.get_m_sock() &gt; sock_max )
					sock_max = sock2.get_m_sock();

				// h�chster Index f�r client_sock f�r die anschlie�ende Schleife ben�tigt
				if( i &gt; max )
					max = i;

				// ... weitere (Lese-)Deskriptoren bereit ?
				if( --ready &lt;= 0 )
					continue; //Nein ...
			} // if(FD_ISSET ...

			 // Ab hier werden alle Verbindungen von Clients auf die Ankunft von neuen Daten �berpr�ft
			for(i=0; i&lt;=max; i++) 
			{
				string s;
				sock3.set_m_sock(client_sock[i]);
				if((sock3.get_m_sock()) &lt; 0)
					continue;

				// (Socket-)Deskriptor gesetzt ...
				if(FD_ISSET(sock3.get_m_sock(), &amp;lese_sock)) 
				{
					// ... dann die Daten lesen
					sock3.recv(s);
					cout &lt;&lt; &quot;Nachricht empfangen: &quot; &lt;&lt; s &lt;&lt; endl;
					cout.flush();
					if( s == &quot;quit&quot; ) 
					{
						sock3.close();
						//aus Menge l�schen
						FD_CLR(sock3.get_m_sock(), &amp;gesamt_sock); 
						//auf -1 setzen
						client_sock[i]=-1;          
						cout &lt;&lt; &quot;Ein Client hat sich beendet&quot; &lt;&lt; endl;
					}
					// Noch lesbare Deskriptoren vorhanden ... ?
					if( --ready &lt;= 0 )
						break; //Nein ...
				}
			}
		} // for(;;)          
	}

	catch (SockExcept&amp; e) 
	{
		cout &lt;&lt; &quot;Exception wurde ausgworfen: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}

	dm_client.close();
	return 0;
}
//EOF
</code></pre>
<p>Vielen Dank schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/226577/c-linux-client-server-anwendung-in-einem-programm</link><generator>RSS for Node</generator><lastBuildDate>Wed, 30 Sep 2026 18:59:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226577.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Nov 2008 10:19:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [C++&#x2F;Linux] Client&#x2F;Server Anwendung in einem Programm ??? on Mon, 03 Nov 2008 10:19:17 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich möchte eine Server/Client Geschichte aufbauen. Code in C++.<br />
Als Grundlage habe ich das Buch von Jürgen Wolf C++ A-Z hier liegen und<br />
die Beispiele zum Thema mal ausprobiert, leider komme ich aber nicht weiter.<br />
Laufen soll das ganze unter Linux.</p>
<p>Wie soll das ganze aussehen.</p>
<p>Programm 1:<br />
1. Programm 1 soll als Client auf einen Server (Programm 3) warten,<br />
der hin und wieder einen String schickt.<br />
2. Programm 1 soll aber auch ein Server sein und mindests einen Client<br />
(Programm 2) bedienen können, der Steuercodes an Programm 1 schickt.</p>
<p>Programm 2:<br />
Client-Anwendung die Steuercodes an Programm 1 schickt.</p>
<p>Programm 3:<br />
Server-Anwendung die einen String an Programm 1 schickt.</p>
<p>Ich habe mir den code multi_server.cpp von J.Wolf angeschaut und dort einfach<br />
echo_client.cpp mit eingebaut, leider klappt das net so gut, ich kann jeder<br />
Anwendung für sich benutzen (also Programm 1 ist entweder Client oder Server)<br />
aber beides zusammen bekomme ich net hin. Hab Ihr ein paar Tipps für mich,<br />
damit ich irgendwie weiter komme?</p>
<p>Ich habe die Dateien mal nicht alle mitangehängt, weil es doch schon einige sind, ich würde die Dateien auf Anfrage einfach per PM verschicken und das fertige Ergebnis dann hier posten. Wenn das ok wäre.</p>
<p>Folgend nur der Code von multi_server.cpp (angepasst)</p>
<pre><code>// multi_server.cpp
#include &quot;socket.h&quot;
#include &lt;iostream&gt;
using namespace std;

int main() {

	// ab hier client daemon code
	int len = 0;
	string fritzboxIP = &quot;127.0.0.1&quot;;
	long fritzboxPort = 15001;

	Socket dm_client;
	dm_client.create();
	dm_client.connect( fritzboxIP, fritzboxPort );
	dm_client.fcntl();
	int mydm_client = dm_client.get_m_sock();

	string c;

	int i, ready, sock_max, max=-1;
	int client_sock[FD_SETSIZE];
	fd_set gesamt_sock, lese_sock;

	try 
	{
		Socket sock1, sock2, sock3;
		sock1.create();
		sock1.bind(15000);
		sock1.listen();
		sock_max = sock1.get_m_sock();

		for(i=0; i&lt;FD_SETSIZE; i++)
			client_sock[i]=-1;

		FD_ZERO(&amp;gesamt_sock);
		FD_SET(sock1.get_m_sock(), &amp;gesamt_sock);

		for (;;) 
		{
			// ab hier warten auf den fritzbox-server
			dm_client.recvNOWait( c );
			len = c.size();
			if (c == &quot;exit&quot;) break;
			if (len &gt; 0) 
			{
				cout &lt;&lt; &quot;Nachricht vom fritzbox: &quot; &lt;&lt; c &lt;&lt; endl;
			}

			// Immer Aktualisieren
			lese_sock = gesamt_sock;
			// Hier wird auf die Ankunft von Daten oder neuer Verbindungen von Clients gewartet
			ready = select( sock_max+1, &amp;lese_sock,NULL, NULL, NULL );
			// Eine neue Client-Verbindung ... ?
			if( FD_ISSET(sock1.get_m_sock(), &amp;lese_sock)) 
			{
				sock1.accept(sock2);
				// Freien Platz f�r (Socket-)Deskriptor in client_sock suchen und vergeben 
				for( i=0; i&lt; FD_SETSIZE; i++)
					if(client_sock[i] &lt; 0) 
					{
						client_sock[i] = sock2.get_m_sock();
						break;
					}

				// Mehr als FD_SETSIZE Client sind nicht m�glich        
				if( i == FD_SETSIZE )
					throw SockExcept(&quot;Server �berlastet - zuviele Clients&quot;);

				// Den neuen (Socket-)Deskriptor zur (Gesamt)Menge hinzuf�gen
				FD_SET(sock2.get_m_sock(), &amp;gesamt_sock);

				// select() ben�tigt die h�chste (Socket-)Deskriptor-Nummer
				if( sock2.get_m_sock() &gt; sock_max )
					sock_max = sock2.get_m_sock();

				// h�chster Index f�r client_sock f�r die anschlie�ende Schleife ben�tigt
				if( i &gt; max )
					max = i;

				// ... weitere (Lese-)Deskriptoren bereit ?
				if( --ready &lt;= 0 )
					continue; //Nein ...
			} // if(FD_ISSET ...

			 // Ab hier werden alle Verbindungen von Clients auf die Ankunft von neuen Daten �berpr�ft
			for(i=0; i&lt;=max; i++) 
			{
				string s;
				sock3.set_m_sock(client_sock[i]);
				if((sock3.get_m_sock()) &lt; 0)
					continue;

				// (Socket-)Deskriptor gesetzt ...
				if(FD_ISSET(sock3.get_m_sock(), &amp;lese_sock)) 
				{
					// ... dann die Daten lesen
					sock3.recv(s);
					cout &lt;&lt; &quot;Nachricht empfangen: &quot; &lt;&lt; s &lt;&lt; endl;
					cout.flush();
					if( s == &quot;quit&quot; ) 
					{
						sock3.close();
						//aus Menge l�schen
						FD_CLR(sock3.get_m_sock(), &amp;gesamt_sock); 
						//auf -1 setzen
						client_sock[i]=-1;          
						cout &lt;&lt; &quot;Ein Client hat sich beendet&quot; &lt;&lt; endl;
					}
					// Noch lesbare Deskriptoren vorhanden ... ?
					if( --ready &lt;= 0 )
						break; //Nein ...
				}
			}
		} // for(;;)          
	}

	catch (SockExcept&amp; e) 
	{
		cout &lt;&lt; &quot;Exception wurde ausgworfen: &quot; &lt;&lt; e.get_SockExcept() &lt;&lt; endl;
	}

	dm_client.close();
	return 0;
}
//EOF
</code></pre>
<p>Vielen Dank schonmal</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609312</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609312</guid><dc:creator><![CDATA[tyrel]]></dc:creator><pubDate>Mon, 03 Nov 2008 10:19:17 GMT</pubDate></item><item><title><![CDATA[Reply to [C++&#x2F;Linux] Client&#x2F;Server Anwendung in einem Programm ??? on Mon, 03 Nov 2008 12:26:38 GMT]]></title><description><![CDATA[<p>tyrel schrieb:</p>
<blockquote>
<p>Programm 1:<br />
1. Programm 1 soll als Client auf einen Server (Programm 3) warten,<br />
der hin und wieder einen String schickt.</p>
</blockquote>
<p>Normalerweise ist der, der wartet der Server, und der Client ist derjenige der die Anfragen verschickt und die Antworten des Servers verwertet.</p>
<p>Um deinen Code noch etwas lesbarer zu machen könntest du ihn erstens in cpp-Tags setzen (Syntaxhighlighting erleichtert das Lesen) und zweitens die Unterteilung von logisch zusammenhängendem Code etwas deutlicher hervorheben (nicht nach jeder zweiten Zeile ne Leerzeile, dafür nach größeren Absätzen evtl. mal zwei Leerzeilen). Eventuell wäre es auch von Vorteil, die eine oder andere Aufgabe in eine eigene Funktion auszulagern. Momentan ist der Code nur ein schwer verdaulicher großer Block, den sich vermutlich nicht viele durchlesen werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609386</guid><dc:creator><![CDATA[pumuckl@loggedoff]]></dc:creator><pubDate>Mon, 03 Nov 2008 12:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to [C++&#x2F;Linux] Client&#x2F;Server Anwendung in einem Programm ??? on Mon, 03 Nov 2008 12:48:06 GMT]]></title><description><![CDATA[<p>ich weiss, ich habe den code so aus dem buch übernommen. es ist fast 1:1 dass was im buch steht. ich habe nur zwei blöcke reinkopiert. ich kann mir schon vorstellen, dass es schwer ist. meine hoffnung ist eben, dass es jemand gibt, der mir zumindest ein paar tipps sagen kann.<br />
normale client/server anwendungen sprich der server wartet auf den client usw. das habe ich mit hilfe des buches problemlos hinbekommen, nur eben meinen speziellen fall noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1609400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1609400</guid><dc:creator><![CDATA[tyrel]]></dc:creator><pubDate>Mon, 03 Nov 2008 12:48:06 GMT</pubDate></item></channel></rss>