<?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 socket klasse]]></title><description><![CDATA[<p>Hallo<br />
Ich wollte wieder mit c++ anfangen und gleich mal sockets programmieren.<br />
Dazu will ich mir eine klasse schreiben wie ich sie von delphi oder anderen programmiersprachen kenne.<br />
Der clientsocket soll senden und empfangen können und das gleichzeitig.<br />
Ich hab mir also zum testen einmal einen non blocking socket geschrieben der in einem thread auf recv geht.</p>
<p>Ich will aber ordentlich damit umgehen können - deshalb die frage &quot;kann man das so machen&quot;.<br />
Oder ist das kompletter unsinn. ( funktionieren tuts - aber naja ..... ).</p>
<pre><code class="language-cpp">/* client.c */
#define BUF 1024

typedef boost::mutex::scoped_lock lock_type; 
boost::mutex io_mutex;

void rsvthread ( int create_socket ){
  char * buffer = (char*) malloc (BUF);
  int size;
    long save_fd;
    do {
      save_fd = fcntl( create_socket, F_GETFL );
      save_fd |= O_NONBLOCK;
      fcntl( create_socket, F_SETFL, save_fd );
      lock_type lk( io_mutex ); 
      	size = recv(create_socket, buffer, BUF-1, 0);
      	if( size &gt; 0){
         	buffer[size] = '\0';
      		printf (&quot;Nachricht erhalten: %s\n&quot;, buffer);
      		}
      lk.unlock();
      sleep(1);
      } while (strcmp (buffer, &quot;quit\n&quot;) != 0);
}

int main (int argc, char *argv[]) {
  int create_socket;
  char * buffer = (char*) malloc (BUF);
  struct sockaddr_in address;
  int size;

  if( argc &lt; 2 ){
     printf(&quot;Usage: %s ServerAdresse\n&quot;, *argv);
     exit(EXIT_FAILURE);
  }

  if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) &gt; 0)
    printf (&quot;Socket wurde angelegt\n&quot;);

  address.sin_family = AF_INET;
  address.sin_port = htons (15000);
  inet_aton (argv[1], &amp;address.sin_addr);

  if (connect ( create_socket,
                (struct sockaddr *) &amp;address,
                sizeof (address)) == 0){
    printf (&quot;Verbindung mit dem Server (%s) hergestellt\n&quot;,
       inet_ntoa (address.sin_addr));
    boost::thread thrd( boost::bind( &amp;rsvthread, create_socket ) );   

  	do {
     	printf (&quot;Nachricht zum Versenden: &quot;);
     	fgets (buffer, BUF, stdin);
     	lock_type lk( io_mutex ); 
     		send(create_socket, buffer, strlen (buffer), 0);
     	lk.unlock();
  	} while (strcmp (buffer, &quot;quit\n&quot;) != 0);
  	thrd.join();
  } else { std::cout &lt;&lt; &quot;keine verbindung&quot; &lt;&lt; std::endl; }
  close (create_socket);
  return EXIT_SUCCESS;
}
</code></pre>
<p>Ich fühl mich in einer Sprache erst wohl, wenn ich weiß, dass ich vernünftigen code produziere, deshalb hoffe ich das schaut sich jemand an ......... ich weiß solche fragen sind langweilig, aber ich will c/c++ ordentlich lernen.</p>
<p>lg<br />
Verucca</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/204623/client-socket-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 18:51:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/204623.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Feb 2008 13:54:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 13:57:15 GMT]]></title><description><![CDATA[<p>Hallo<br />
Ich wollte wieder mit c++ anfangen und gleich mal sockets programmieren.<br />
Dazu will ich mir eine klasse schreiben wie ich sie von delphi oder anderen programmiersprachen kenne.<br />
Der clientsocket soll senden und empfangen können und das gleichzeitig.<br />
Ich hab mir also zum testen einmal einen non blocking socket geschrieben der in einem thread auf recv geht.</p>
<p>Ich will aber ordentlich damit umgehen können - deshalb die frage &quot;kann man das so machen&quot;.<br />
Oder ist das kompletter unsinn. ( funktionieren tuts - aber naja ..... ).</p>
<pre><code class="language-cpp">/* client.c */
#define BUF 1024

typedef boost::mutex::scoped_lock lock_type; 
boost::mutex io_mutex;

void rsvthread ( int create_socket ){
  char * buffer = (char*) malloc (BUF);
  int size;
    long save_fd;
    do {
      save_fd = fcntl( create_socket, F_GETFL );
      save_fd |= O_NONBLOCK;
      fcntl( create_socket, F_SETFL, save_fd );
      lock_type lk( io_mutex ); 
      	size = recv(create_socket, buffer, BUF-1, 0);
      	if( size &gt; 0){
         	buffer[size] = '\0';
      		printf (&quot;Nachricht erhalten: %s\n&quot;, buffer);
      		}
      lk.unlock();
      sleep(1);
      } while (strcmp (buffer, &quot;quit\n&quot;) != 0);
}

int main (int argc, char *argv[]) {
  int create_socket;
  char * buffer = (char*) malloc (BUF);
  struct sockaddr_in address;
  int size;

  if( argc &lt; 2 ){
     printf(&quot;Usage: %s ServerAdresse\n&quot;, *argv);
     exit(EXIT_FAILURE);
  }

  if ((create_socket = socket (AF_INET, SOCK_STREAM, 0)) &gt; 0)
    printf (&quot;Socket wurde angelegt\n&quot;);

  address.sin_family = AF_INET;
  address.sin_port = htons (15000);
  inet_aton (argv[1], &amp;address.sin_addr);

  if (connect ( create_socket,
                (struct sockaddr *) &amp;address,
                sizeof (address)) == 0){
    printf (&quot;Verbindung mit dem Server (%s) hergestellt\n&quot;,
       inet_ntoa (address.sin_addr));
    boost::thread thrd( boost::bind( &amp;rsvthread, create_socket ) );   

  	do {
     	printf (&quot;Nachricht zum Versenden: &quot;);
     	fgets (buffer, BUF, stdin);
     	lock_type lk( io_mutex ); 
     		send(create_socket, buffer, strlen (buffer), 0);
     	lk.unlock();
  	} while (strcmp (buffer, &quot;quit\n&quot;) != 0);
  	thrd.join();
  } else { std::cout &lt;&lt; &quot;keine verbindung&quot; &lt;&lt; std::endl; }
  close (create_socket);
  return EXIT_SUCCESS;
}
</code></pre>
<p>Ich fühl mich in einer Sprache erst wohl, wenn ich weiß, dass ich vernünftigen code produziere, deshalb hoffe ich das schaut sich jemand an ......... ich weiß solche fragen sind langweilig, aber ich will c/c++ ordentlich lernen.</p>
<p>lg<br />
Verucca</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449778</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449778</guid><dc:creator><![CDATA[Verucca]]></dc:creator><pubDate>Tue, 05 Feb 2008 13:57:15 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 14:37:00 GMT]]></title><description><![CDATA[<p>Wenn Du schon Boost verwendest, warum dann nicht auch Boost::asio?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449832</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449832</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Tue, 05 Feb 2008 14:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 14:37:06 GMT]]></title><description><![CDATA[<p>Öhm, ich habe mir den Code jetzt nicht groß angeschaut, aber ich denke du solltest mal deine Einrückung verbessern.</p>
<p>Und wenn du schon boost benutzt, kannst du auch gleich <a href="http://asio.sf.net" rel="nofollow">boost.asio</a> für sockets nutzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449833</guid><dc:creator><![CDATA[The-Kenny]]></dc:creator><pubDate>Tue, 05 Feb 2008 14:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 15:39:27 GMT]]></title><description><![CDATA[<p>bei SOCK_STREAM bekommst du keine Pakete sondern einen Byte-Stream den du selbst in Pakete zerlegen musst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1449886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1449886</guid><dc:creator><![CDATA[zu]]></dc:creator><pubDate>Tue, 05 Feb 2008 15:39:27 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 20:23:35 GMT]]></title><description><![CDATA[<p>@aridamn<br />
werd ich mir mal anschauen was die wirklich können, aber für boost finde ich immer recht wenig doku die einfach erklärt wird</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15080">@The-Kenny</a><br />
naja sobald ich einen ordentlichen editor für meine versuche verwende werd ich wohl auch das verbessern <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>@zu<br />
versteh ich nicht.<br />
hab ich geschreiben, dass ich packete haben will?<br />
das ich mir bei tcp ein eigenes protokoll machen muss ist mir klar - wie gesagt hab ich schon in anderen sprachen einiges mit sockets gemacht.<br />
eigentlich will ich letzten endes genau streams haben.<br />
ich will mir einen streaming client bauen der einen stream von mythbackend ( mythtv projekt ) an einen player weiterleitet.<br />
Eigentlich sollte der stream sogar über eine callback funktion geliefert werden.<br />
wenn was da ist, dann wird verarbeitet - also event basierend.<br />
aber ich steh ja noch am anfang - erstmal c/c++ ordentlich verstehen.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1450060</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1450060</guid><dc:creator><![CDATA[Verucca]]></dc:creator><pubDate>Tue, 05 Feb 2008 20:23:35 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 21:14:06 GMT]]></title><description><![CDATA[<p>Ne hast du nicht gesagt, aber du hast es so programmiert. Ich meine du rufst recv auf und prüfst dann ob &quot;QUIT\n&quot; im Puffer steht. Aber was ist wenn du bei jedem recv Aufruf z.B. nur 1 Byte bekommst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1450091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1450091</guid><dc:creator><![CDATA[zu]]></dc:creator><pubDate>Tue, 05 Feb 2008 21:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to client socket klasse on Tue, 05 Feb 2008 21:29:16 GMT]]></title><description><![CDATA[<p>da hast du vollkommen recht.<br />
das quit steht eigentlicht nur drin, weil ich das mit einem selbstgeschriebenen server teste und ich fix eine abbruch bedingung gebraucht hab.<br />
aber richtig - das ist unsinn - war aber auch nicht der sinn der sache - der abbruch wird eher im thread erfolgen und nicht über den socket.</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1450098</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1450098</guid><dc:creator><![CDATA[Verucca]]></dc:creator><pubDate>Tue, 05 Feb 2008 21:29:16 GMT</pubDate></item></channel></rss>