<?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[Netzwerkprogrammierung Teil 2]]></title><description><![CDATA[<p>Hallo mal wieder! <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>Mit meinem Chat geht es schon ganz schön voran! Doch hier und da zeigen sich noch die Probleme und die Fragen!</p>
<p>Hier mein Code:</p>
<p>Server.cpp</p>
<pre><code>//Server.cpp

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

int WinSockStart();
void thread_send();
void thread_receive();

long handle;
SOCKET sock_main, sock_specified;

int main()
{
  SOCKADDR_IN server;
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = ADDR_ANY;

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\n&quot;;
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;;

  sock_main = socket(AF_INET, SOCK_STREAM, 0);
  if(sock_main == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = bind(sock_main, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht an den Server gebunden werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket wurde an den Server gebunden!\n&quot;;

  handle = listen(sock_main, 10);
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Aktion 'listen' konnte nicht ausgeführt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Server lauscht...\n&quot;;

  sock_specified = accept(sock_main, NULL, NULL);
  if(sock_specified == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Verbindung zu neuem Socket fehlgeschlagen!\n&quot;;
  else
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert!\n&quot;;

  HANDLE handle1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_send, 0,0,0);
  HANDLE handle2 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_receive, 0,0,0);
  WaitForSingleObject(handle1, INFINITE);
  WaitForSingleObject(handle2, INFINITE);
  closesocket(sock_main); 
  closesocket(sock_specified); 
  WSACleanup(); 
}

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}

void thread_send()
{
  char data_send[256];

  while(handle != SOCKET_ERROR)
  {
    gets(data_send);
    handle = send(sock_specified, data_send, strlen(data_send), 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\n&quot;;
     break;
    }
  }

}

void thread_receive()
{
  char data_received[256];

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock_specified, data_received, 256, 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\n&quot;;
     break;
    }
    else
    {
      data_received[handle] = '\0';
      cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
    }
  }
}
</code></pre>
<p>Client.cpp</p>
<pre><code>//Client.cpp

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

int WinSockStart();
void thread_send();
void thread_receive();

long handle;
SOCKET sock;

int main()
{
  SOCKADDR_IN server;
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = inet_addr(&quot;127.0.0.1&quot;);  

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\n&quot;;
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;;

  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = connect(sock, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Verbindung zum Server fehlgeschlagen!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket wurde mit Server verbunden!\n&quot;;

  HANDLE handle1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_send, 0,0,0);
  HANDLE handle2 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_receive, 0,0,0);
  WaitForSingleObject(handle1, INFINITE);
  WaitForSingleObject(handle2, INFINITE);
  closesocket(sock);
  WSACleanup(); 
}

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}

void thread_send()
{
  char data_send[256];

  while(handle != SOCKET_ERROR)
  {
    gets(data_send);
    handle = send(sock, data_send, strlen(data_send), 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\n&quot;;
     break;
    }
  }

}

void thread_receive()
{
  char data_received[256];

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock, data_received, 256, 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\n&quot;;
     break;
    }
    else
    {
      data_received[handle] = '\0';
      cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';  }
    }
}
</code></pre>
<p>Meine 7 Fragen:</p>
<p>1. Ist diese Methode die übliche Methode, um einen Chat zu programmieren??</p>
<p>2. Nutzt ICQ beispielsweise auch diese Methode? Wenn ja, nutzt ICQ dann den Port 80 oder auch einen willkürlichen? Denn beim Öffnen meines Chats kommt erst mal ne Firewallwarnung, bei ICQ hingegen nicht...</p>
<p>3. Wenn ich beispielsweise Hallo an den Clienten schicke, und dieses Hallo dann im Chararray data_received steckt, wie kann ich ein solches Array dann vergleichen? Angenommen ich möchte wissen, ob der Server &quot;Hallo&quot; schrieb, dann funktioniert ja folgender Code nicht:</p>
<pre><code>if(data_received == &quot;Hallo&quot;)
</code></pre>
<p>4. Wenn ich ein Chararray deklariere, und ihm nachher einen neuen Wert zuweise, und diesen dann wieder überschreiben will, dann geht das nicht mehr, aber wieso nicht:<br />
[code]char data[] = &quot;Hallo&quot;;<br />
data[] = &quot;Tschüs&quot;; //funktioniert nicht<br />
char data[] = &quot;Tschüs&quot;; //funktioniert![quote]</p>
<p>5. Gibt es einen Unterschied zwischen char data = &quot;Hallo&quot; und char data[] = &quot;Hallo&quot;??</p>
<p>6. In meinem Chat gibt es noch ein Problem, und zwar wenn man gerade einen längeren Text schreibt, und der Partner sendet seinen Text, so wird der längere Text unterbrochen und das vom Partner gesendete wird angezeigt. Wie kann ich das in Einklang bringen, sodass ich nicht mit einer Nachricht beim Schreiben meiner Nachricht unterbrochen werde??</p>
<p>7. Ist es denn iwi möglich, ein Konsolenprogramm im Hintergrund zu öffnen, also so dass die Konsole versteckt bleibt??</p>
<p>Ich hoffe ich habe mich verständlich ausgedrückt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219512/netzwerkprogrammierung-teil-2</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 01:13:52 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219512.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Aug 2008 12:07:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 12:07:13 GMT]]></title><description><![CDATA[<p>Hallo mal wieder! <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>Mit meinem Chat geht es schon ganz schön voran! Doch hier und da zeigen sich noch die Probleme und die Fragen!</p>
<p>Hier mein Code:</p>
<p>Server.cpp</p>
<pre><code>//Server.cpp

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

int WinSockStart();
void thread_send();
void thread_receive();

long handle;
SOCKET sock_main, sock_specified;

int main()
{
  SOCKADDR_IN server;
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = ADDR_ANY;

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\n&quot;;
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;;

  sock_main = socket(AF_INET, SOCK_STREAM, 0);
  if(sock_main == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = bind(sock_main, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht an den Server gebunden werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket wurde an den Server gebunden!\n&quot;;

  handle = listen(sock_main, 10);
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Aktion 'listen' konnte nicht ausgeführt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Server lauscht...\n&quot;;

  sock_specified = accept(sock_main, NULL, NULL);
  if(sock_specified == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Verbindung zu neuem Socket fehlgeschlagen!\n&quot;;
  else
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert!\n&quot;;

  HANDLE handle1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_send, 0,0,0);
  HANDLE handle2 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_receive, 0,0,0);
  WaitForSingleObject(handle1, INFINITE);
  WaitForSingleObject(handle2, INFINITE);
  closesocket(sock_main); 
  closesocket(sock_specified); 
  WSACleanup(); 
}

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}

void thread_send()
{
  char data_send[256];

  while(handle != SOCKET_ERROR)
  {
    gets(data_send);
    handle = send(sock_specified, data_send, strlen(data_send), 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\n&quot;;
     break;
    }
  }

}

void thread_receive()
{
  char data_received[256];

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock_specified, data_received, 256, 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\n&quot;;
     break;
    }
    else
    {
      data_received[handle] = '\0';
      cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
    }
  }
}
</code></pre>
<p>Client.cpp</p>
<pre><code>//Client.cpp

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

int WinSockStart();
void thread_send();
void thread_receive();

long handle;
SOCKET sock;

int main()
{
  SOCKADDR_IN server;
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = inet_addr(&quot;127.0.0.1&quot;);  

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\n&quot;;
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;;

  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = connect(sock, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Verbindung zum Server fehlgeschlagen!\n&quot;;
  else
    cout &lt;&lt; &quot;Socket wurde mit Server verbunden!\n&quot;;

  HANDLE handle1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_send, 0,0,0);
  HANDLE handle2 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)thread_receive, 0,0,0);
  WaitForSingleObject(handle1, INFINITE);
  WaitForSingleObject(handle2, INFINITE);
  closesocket(sock);
  WSACleanup(); 
}

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}

void thread_send()
{
  char data_send[256];

  while(handle != SOCKET_ERROR)
  {
    gets(data_send);
    handle = send(sock, data_send, strlen(data_send), 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\n&quot;;
     break;
    }
  }

}

void thread_receive()
{
  char data_received[256];

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock, data_received, 256, 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\n&quot;;
     break;
    }
    else
    {
      data_received[handle] = '\0';
      cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';  }
    }
}
</code></pre>
<p>Meine 7 Fragen:</p>
<p>1. Ist diese Methode die übliche Methode, um einen Chat zu programmieren??</p>
<p>2. Nutzt ICQ beispielsweise auch diese Methode? Wenn ja, nutzt ICQ dann den Port 80 oder auch einen willkürlichen? Denn beim Öffnen meines Chats kommt erst mal ne Firewallwarnung, bei ICQ hingegen nicht...</p>
<p>3. Wenn ich beispielsweise Hallo an den Clienten schicke, und dieses Hallo dann im Chararray data_received steckt, wie kann ich ein solches Array dann vergleichen? Angenommen ich möchte wissen, ob der Server &quot;Hallo&quot; schrieb, dann funktioniert ja folgender Code nicht:</p>
<pre><code>if(data_received == &quot;Hallo&quot;)
</code></pre>
<p>4. Wenn ich ein Chararray deklariere, und ihm nachher einen neuen Wert zuweise, und diesen dann wieder überschreiben will, dann geht das nicht mehr, aber wieso nicht:<br />
[code]char data[] = &quot;Hallo&quot;;<br />
data[] = &quot;Tschüs&quot;; //funktioniert nicht<br />
char data[] = &quot;Tschüs&quot;; //funktioniert![quote]</p>
<p>5. Gibt es einen Unterschied zwischen char data = &quot;Hallo&quot; und char data[] = &quot;Hallo&quot;??</p>
<p>6. In meinem Chat gibt es noch ein Problem, und zwar wenn man gerade einen längeren Text schreibt, und der Partner sendet seinen Text, so wird der längere Text unterbrochen und das vom Partner gesendete wird angezeigt. Wie kann ich das in Einklang bringen, sodass ich nicht mit einer Nachricht beim Schreiben meiner Nachricht unterbrochen werde??</p>
<p>7. Ist es denn iwi möglich, ein Konsolenprogramm im Hintergrund zu öffnen, also so dass die Konsole versteckt bleibt??</p>
<p>Ich hoffe ich habe mich verständlich ausgedrückt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1558959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1558959</guid><dc:creator><![CDATA[Gapa]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:07:13 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 12:48:50 GMT]]></title><description><![CDATA[<p>1. Sag mal, ich will dir jetzt nicht ans Bein pieseln, aber ist das wirklich zu 100% dein Code? Der Stil des Codes oder die Art deiner Fragen widersprechen sich meiner Meinung nach ein bisschen.</p>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">sock_specified = accept(sock_main, NULL, NULL);
</code></pre>
<p>Sowas ist echt grottig und entspricht nicht den korrekten Argumenten der accept-Funktion.</p>
<p>Zu deinen Fragen:</p>
<p>4. Das Wort &quot;Hallo&quot; besitzt 5 Zeichen. Also die Array-Elemente 0 bis 4. &quot;Tschüß&quot; hingegen, was ja auch noch Werte der &quot;extended ASCII table&quot; nutzt, besitzt 6 zeichen. Die zugehörigen Array-Elemente sind also 0 bis 5. Da du aber mit</p>
<pre><code class="language-cpp">char data[] = &quot;Hallo&quot;;
</code></pre>
<p>nur ein ARray mit der größe für 5 Elemente anlegst, ist es doch klar, dass &quot;Tschüs&quot; da nicht reinpasst....was dann wieder auf meine erste Frage schließt und sie damit indirekt beantwortet...nichts für ungut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559015</guid><dc:creator><![CDATA[Berufspenner]]></dc:creator><pubDate>Mon, 04 Aug 2008 12:48:50 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 13:09:48 GMT]]></title><description><![CDATA[<p>Sag mal ist denn sowas zu fassen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Dieser Code ist zu 100% mein Code!!!!!<br />
Wenn du ein nur ein bisschen im Forum gesucht hättest, wäre dir aufgefallen, dass ich an diesem Projekt schon länger arbeite und mir diesen Code selbst zusammengeflickt habe!</p>
<p>Trotzdem Danke für die Erläuterung auf Frage 4!<br />
Ich gestehe, dass ich mich mit C-Arrays gar nicht so gut auskenne, doch das ist noch kein Grund für eine solche Schlussfolgerung!</p>
<p>Und wenn du etwas an meiner accept-Funktion auszusetzen hast, dann könntest du ja auch wenigstens einen besseren Vorschlag bringen, oder?<br />
Kann ja gut sein, dass diese Funktion nicht ordnungsgemäß aufgerufen wird, und ich bin für Verbesserungsvorschläge gern zu haben, doch einfach so drann rumnörgeln hilft mir wirklich nicht weiter... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>So far<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559037</guid><dc:creator><![CDATA[Gapa]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:09:48 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 13:54:23 GMT]]></title><description><![CDATA[<p>zur accept funktion:</p>
<pre><code class="language-cpp">mainsocket = socket(AF_INET, SOCK_STREAM, 0); // tcp
if (mainsocket == -1)
{
    // Fehler
}
sockaddr_in addr;
addr.sin_addr.S_un.S_addr = INADDR_ANY; // jede ip
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);  // der port
int status = bind(mainsocket, (sockaddr*)&amp;addr, sizeof(addr));
if (status == -1)
{
    // da ist ein fehler passiert
}
sockaddr addr;
int lenght = sizeof(addr);
SOCKET newsock = accept(mainsocket, &amp;addr, &amp;lenght);
if (newsocket == -1)...
</code></pre>
<p>in der struktur addr bekommst du dann außerdem noch informationen über den client, also ip und sowas</p>
<p>mfg helferlein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559062</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559062</guid><dc:creator><![CDATA[helferlein]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:54:23 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 13:55:46 GMT]]></title><description><![CDATA[<p>edit:<br />
listen() vergessen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1559063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559063</guid><dc:creator><![CDATA[helferlein]]></dc:creator><pubDate>Mon, 04 Aug 2008 13:55:46 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 14:02:13 GMT]]></title><description><![CDATA[<p>Gapa schrieb:</p>
<blockquote>
<p>Sag mal ist denn sowas zu fassen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /><br />
Dieser Code ist zu 100% mein Code!!!!!</p>
</blockquote>
<p>Gapa schrieb:</p>
<blockquote>
<p>meiner accept-Funktion</p>
</blockquote>
<p>Funny boy.</p>
<p>SCNR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559066</guid><dc:creator><![CDATA[Popoklopfer@ausgeloggt]]></dc:creator><pubDate>Mon, 04 Aug 2008 14:02:13 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 18:10:47 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18081">@Gapa</a></p>
<p>Wie gesagt, nimm es mir nicht persönlich, aber ich hab bei der ganzen Sache eben Bauchschmerzen, da es nicht zusammen passt. Zumal ich nicht jedermanns Lebensgeschichte in einem Forum verfolge, um dann auf eine Frage zu Antworten. Ich beziehe mich da immer schlichtweg auf das vorliegende Thema. Abgesehen davon sollte man nicht in Gefillden wie der Netzwerkprogrammierung rumfingern, wenn man nichteinmal mit C-Arrays umgehen kann. Das ist in dem Zusammenhang eine extrem große Sicherheitslücke. Außerdem kannst du ja auch locker die vector-Klasse benutzten.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@Topic</a></p>
<p>Also, accept() erwartet drei Parameter: 1. die ID des Serversocket selber, 2. den Adresspointer auf die Struktur, in die dann die Informationen des Clients reingeschrieben werden sollen und 3. die Größe der Server-Struktur. Dein Ausdruck müsste also so aussehen</p>
<pre><code class="language-cpp">SOCKADDR_IN server, client;
sock_specified = accept(sock_main, (struct sockaddr *) &amp;client, sizeof(sock_main));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1559193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559193</guid><dc:creator><![CDATA[Berufspenner]]></dc:creator><pubDate>Mon, 04 Aug 2008 18:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Mon, 04 Aug 2008 19:30:02 GMT]]></title><description><![CDATA[<p>1. gibts auch cpp-tags - da erkennt man dann auch bissl was...</p>
<ol start="2">
<li></li>
</ol>
<pre><code class="language-cpp">void thread_receive() 
{ 
  char data_received[256]; //256 zeichen

  while(handle != SOCKET_ERROR) 
  { 
    handle = recv(sock, data_received, 256, 0); //(bis zu) 256 zeichen empfangen
    if(handle == SOCKET_ERROR) 
    { 
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\n&quot;; 
     break; 
    } 
    else 
    { 
      data_received[handle] = '\0'; //und dann die 0 anfügen...
      cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';  } 
    } 
}
</code></pre>
<p>wenn man das ganze mal mit 2 durchgeht, sieht man (noch viel besser), was ich meine:</p>
<pre><code>char a[2];
=&gt; a[0]; a[1]
int n = recv (X, a, 2, 0);
n==SOCKET_ERROR =&gt; fehler (hast du ja)
n==0: disconnect (hast du nicht?!)
n==1: hast du und is iO
n==2: a[2] ?!? gibts nicht... also falsch...
</code></pre>
<p>du brauchst also entweder nen um 1 größeren buffer oder sagst dem recv, dass es nen byte weniger bekommt...</p>
<p>außerdem:<br />
1. fällt es mir auch schwer, dir zu glauben, dass du den quelltext selbst zu 100% verstehst...</p>
<blockquote>
<p>Code selbst zusammengeflickt</p>
</blockquote>
<p>hmm... ist es dein code, wenn du immer nur nen paar zeilen auf einmal abgeschrieben hast?<br />
is ja auch kein problem - und dir würd ja au keiner nen vorwurf machen, aber deine reaktion auf den satz war echt ein wenig... übertrieben (und unehrlich wohl auch)...</p>
<p>2. find ich das auch ... sehr sehr unübersichtlich...<br />
erinnert mich iwie sehr an C - von C++ is es noch nen Stückchen weg ^^</p>
<pre><code class="language-cpp">namespace TCP
  {
    class TServerSocket
      {
        private:
          SOCKET socket_nr;
          bool connected;
          unsigned short portnr;
          std::deque &lt;char&gt; Buffer_In;
          std::deque &lt;char&gt; Buffer_Out;
//...
          bool /*fail*/ my_bind (); //etc
static unsigned thread_function (void *_tserversocket)
 {
  TServerSocket *these = static_cast &lt;TServerSocket *&gt; (_tserversocket);
  these-&gt;...;
  //usw....
 }
        public:
          Receive ();
          TServerSocket () : connected (false), portnr(0) {};
          void Connect (unsigned short port_nr) throw ()
           {
            if (my_bind ())
             throw /*bla*/;
            //etc
            connected = true;
            _beginthreadex (&amp;thread_function_to_listen, (void*)this, 0, 0, 0); //weiß es gerad nich ausm kopf - google 
           }
          bool IsConnected () const {return connected;}
      };
  }
</code></pre>
<pre><code class="language-cpp">int main ()
{
TCP::TServerSocket *Server;
Server-&gt;Connect (12345);
}
</code></pre>
<p>Falls du wirklich verstanden hast, was du gemacht hast, dann wird es dir auch nicht schwer fallen, das alles in ne Klasse zu verpacken und bissl komfortabler zu gestalten... Natürlich sind das paar Zeilen und viel zu überlegen, wie man das mit den Clients macht etc, aber es wird sich lohnen...</p>
<p>Bevor wieder einer kommt von wegen Rad neu erfinden:<br />
Natürlich kann man auch xyz nehmen, was keine bugs hat, toll ist und überhaupt... aber ich find so was immer recht gut zum programmieren lernen... auch wenn es mit win-api ist...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559216</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 04 Aug 2008 19:30:02 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Tue, 05 Aug 2008 16:32:40 GMT]]></title><description><![CDATA[<p>Hello again!</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4316">@Berufspenner</a>:<br />
Ja ist schon ok! Aber du kannst mir glauben wenn ich dir sage, dass ich 98 % dieses Codes verstanden habe!<br />
Unter die 2 %, die ich nicht verstanden habe, fallen Dinge wie das Makro &quot;LPTHREAD_START_ROUTINE&quot; oder die Combi aus <em>&amp; bei (SOCKADDR</em>)&amp; - wieso man hier doppelt moppelt^^.</p>
<p>Aber sonst habe ich alles verstanden!</p>
<p>Ich habe jetzt auch (so wie ihr es mir geraten habt) alles etwas besser strukturiert:</p>
<p>Server.cpp</p>
<pre><code>//Server.cpp

#include &quot;Connection.h&quot;
#include &quot;Strings.h&quot;

namespace ProtoTypes
{
  long handle;
  ConnectionS connection;
  void thread_send();
  void thread_receive();
}

int main()
{
  HANDLE handle1 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)ProtoTypes::thread_send, 0,0,0);
  HANDLE handle2 = CreateThread(0,0, (LPTHREAD_START_ROUTINE)ProtoTypes::thread_receive, 0,0,0);
  WaitForSingleObject(handle1, INFINITE);
  WaitForSingleObject(handle2, INFINITE);
}

void ProtoTypes::thread_send()
{
  char data_send[256];

  while(handle != SOCKET_ERROR)
  {
    gets(data_send);
    if(string_spam(data_send))
      handle = send(connection.sock_specified, data_send, strlen(data_send), 0);
    else
      cout &lt;&lt; &quot;Spamfilter blockiert die gesendete Nachricht!\n&quot;;
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\nZum Beenden ENTER druecken...&quot;;
     break;
    }
  }

}

void ProtoTypes::thread_receive()
{
  char data_received[256];

  while(handle != SOCKET_ERROR)
  {
    handle = recv(connection.sock_specified, data_received, 256, 0);
    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!\nZum Beenden ENTER druecken...&quot;;
     break;
    }
    else if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung getrennt!\nZum Beenden ENTER druecken...&quot;;
     break;
    }
    else
    {
      data_received[handle] = '\0';
      if(!string_pruefe(data_received))
        cout &lt;&lt; &quot;-&gt; *****\n&quot;;
      else
        cout &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
    }
  }
}
</code></pre>
<p>Connection.h</p>
<pre><code>//Connection_Server.h

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

class ConnectionS
{
  private:
    WSADATA wsa;
    SOCKADDR_IN server;
    long handle;
  public:
    SOCKET sock_main, sock_specified;
    ConnectionS();
    ~ConnectionS();
};

class ConnectionC
{
  private:
    WSADATA wsa;
    SOCKADDR_IN server;
    long handle;
  public:
    SOCKET sock;
    ConnectionC();
    ~ConnectionC();
};

ConnectionS::ConnectionS()
{
  int port;
  long connections_count;
  char mode[2], ip[30];

  system(&quot;Color 9A&quot;); 

  cout &lt;&lt; &quot;Port eingeben: &quot;;
  cin &gt;&gt; port;
  cout &lt;&lt; '\n';
  cout &lt;&lt; &quot;Anzahl erlaubter Verbindungen: &quot;;
  cin &gt;&gt; connections_count;
  cout &lt;&lt; '\n';
  if(connections_count &gt; 1)
    char ip[] = &quot;ADDR_ANY&quot;;
  else
  {
    cout &lt;&lt; &quot;Zugelassene IP eingeben? (J/N)&quot;;
    cin &gt;&gt; mode;
    if(mode[0] == 'J')
    {
      cout &lt;&lt; &quot;Zugelassene IP: &quot;;
      cin &gt;&gt; ip;
      cout &lt;&lt; '\n';
    }
    else
      char ip[] = &quot;ADDR_ANY&quot;;
  }
  system(&quot;cls&quot;);
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(port);
  if(mode[0] == 'J')
    server.sin_addr.s_addr = inet_addr(ip);
  else
    server.sin_addr.s_addr = ADDR_ANY;

  handle = WSAStartup(MAKEWORD(2,2), &amp;wsa);
  if(handle == SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;; 

  sock_main = socket(AF_INET, SOCK_STREAM, 0);
  if(sock_main == INVALID_SOCKET)
  {
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = bind(sock_main, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht an Server gebunden werden!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Socket wurde an Server gebunden!\n&quot;;

  handle = listen(sock_main, connections_count);
  if(handle == SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;Fehler! Funktion 'listen' fehlgeschlagen!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Server lauscht...\n&quot;;

  sock_specified = accept(sock_main, 0, 0);
  if(sock_specified == INVALID_SOCKET)
  {
    cout &lt;&lt; &quot;Fehler! Es konnte keine neue Verbindung eingegangen werden!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert!\n\n\n\n&lt;&lt;----Chatbereich----&gt;&gt;\n\n&quot;;
}

ConnectionC::ConnectionC()
{
  int port;
  char ip[30];

  system(&quot;Color 9A&quot;); 

  cout &lt;&lt; &quot;Port eingeben: &quot;;
  cin &gt;&gt; port;
  cout &lt;&lt; &quot;ServerIP eingeben: &quot;;
  cin &gt;&gt; ip;
  system(&quot;cls&quot;);
  memset(&amp;server, 0, sizeof(SOCKADDR_IN));
  server.sin_family = AF_INET;
  server.sin_port = htons(port);
  server.sin_addr.s_addr = inet_addr(ip);

  handle = WSAStartup(MAKEWORD(2,2), &amp;wsa);
  if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler! WinSock konnte nicht gestartet werden!\nZum Beenden ENTER druecken...&quot;;
      system(&quot;pause&gt;nul&quot;);
    }
  else
    cout &lt;&lt; &quot;WinSock gestartet!\n&quot;; 

  sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET)
  {
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Socket erstellt!\n&quot;;

  handle = connect(sock, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));
  if(handle == SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;Fehler! Verbindung zum Server '&quot; &lt;&lt; ip &lt;&lt; &quot;' fehlgeschlagen!\nZum Beenden ENTER druecken...&quot;;
    system(&quot;pause&gt;nul&quot;);
  }
  else
    cout &lt;&lt; &quot;Socket wurde mit Server verbunden!\n\n\n\n&lt;&lt;----Chatbereich----&gt;&gt;\n\n&quot;;
}

ConnectionS::~ConnectionS()
{
  closesocket(sock_main); 
  closesocket(sock_specified); 
  WSACleanup(); 
}

ConnectionC::~ConnectionC()
{
  closesocket(sock);
  WSACleanup();
}
</code></pre>
<p>Strings.h</p>
<pre><code>//Strings.h

#include &lt;windows.h&gt;
#include &lt;winsock.h&gt;
#include &lt;iostream&gt;

using namespace std;

bool string_vergleich(char string1[256], char string2[256]);
bool string_spam(char string[256]);
char string_pruefe(char string[256]);

char spam_last[256] = &quot;&quot;;
int spam_count = 0;

bool string_vergleich(char string1[256], char string2[256])
{
  if(strlen(string1) != strlen(string2))
   return 0;
  for(int i = 0; i &lt;= strlen(string1); i++)
  {
    if(string1[i] != string2[i])
     return 0;
  }
 return 1;
}

char string_pruefe(char string[256])
{
  class Archiv
  {
    public:
      char w1[256];
      char w2[256];
      char w3[256];
      char w4[256];
      char w5[256];
  };

  Archiv forbidden;

  strncpy(forbidden.w1, &quot;Eine&quot;, sizeof(&quot;Eine&quot;));
  strncpy(forbidden.w2, &quot;Sammlung&quot;, sizeof(&quot;Sammlung&quot;));
  strncpy(forbidden.w3, &quot;Von&quot;, sizeof(&quot;Von&quot;));
  strncpy(forbidden.w4, &quot;Bösen&quot;, sizeof(&quot;Bösen&quot;));
  strncpy(forbidden.w5, &quot;Wörtern&quot;, sizeof(&quot;Wörtern&quot;));

  if(string_vergleich(string, forbidden.w1))
   return 0;   
  if(string_vergleich(string, forbidden.w2))
   return 0;
  if(string_vergleich(string, forbidden.w3))
   return 0;
  if(string_vergleich(string, forbidden.w4))
   return 0;
  if(string_vergleich(string, forbidden.w5))
   return 0;
 return 1;
}

bool string_spam(char string[256])
{
  if(string_vergleich(string, ::spam_last))
    ::spam_count++;
  else
  {
    ::spam_count = 0;
    memset(&amp;::spam_last, 0, sizeof(spam_last));
    strncpy(::spam_last,string, strlen(string));
  }
  if(::spam_count &gt;= 5)
   return 0;
  return 1;
}
</code></pre>
<p>Ich habe auch noch ein paar Deluxe-funktionen hinzugefügt wie einen kleinen Spamfilter bzw. einen Dedektiv für &quot;Vulgärsprache&quot;.</p>
<p>Hierzu noch ein paar Fragen:</p>
<p>1. (zum Detektiv): Ist es denn iwi möglich, diese Abfrage in eine for-Schleife zu packen, bsp so:</p>
<pre><code>for(int i = 0; i &lt;= 5, i++)
{
  if(string_vergleich(string, forbidden.w(i)) // ??? hier irgendwie so??
   return 0;
}
</code></pre>
<p>2. Wenn ich, egal ob als Server oder als Client, den Chat schließe, dann kommt nicht die Meldung: &quot;Gegenseite hat die Verbindung getrennt&quot;, sondern es kommt die Meldung &quot;Fehler beim Empfangen von Datenpaketen!&quot;, aber wieso??</p>
<p>3. Ist es denn irgendwie möglich, den Namensraum &quot;Prototypen&quot; in der main-funktion zu erstellen, oder müssen Namensräume stehts außerhalb deklariert werden??</p>
<p>4. Bitte postet Verbesserungsvorschläge!! Ich bin für jeden Tipp zu haben!!</p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559754</guid><dc:creator><![CDATA[Gapa]]></dc:creator><pubDate>Tue, 05 Aug 2008 16:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerkprogrammierung Teil 2 on Tue, 05 Aug 2008 21:16:49 GMT]]></title><description><![CDATA[<p>sry, aber du bist doch blöd...<br />
du hast nich eine zeile meines posts gelesen...</p>
<p>ich hab doch extra NUMMERN davor geschrieben und es auch erklärt und ne nur hingeworfen... (also #1 + #2 =&gt; cpp-tags + thread_receive)</p>
<blockquote>
<pre><code class="language-cpp">ConnectionS::ConnectionS()
{
  int port;
  long connections_count;
  char mode[2], ip[30];
/*...*/
}
</code></pre>
</blockquote>
<p>Wieso ne Klasse zur Verbindung, wo noch nicht mal der Port drin ist sondern nur in irgend nem Scope mal vorkommt (hier CTor)...<br />
Außerdem hast du weiter oben nen Vorschlag für ne Klasse, die evtl (mit Sicherheit) ein wenig (sehr viel) eleganter ist... Ne Klasse sollte niemals auf Console oder GUI beschränkt sein... Sie sollte alle Daten per Parameter empfangen und dann ohne eingaben an sich auskommen... Für Ausgaben übergibt man idR eine Referenz zu nem Stream...</p>
<blockquote>
<pre><code class="language-cpp">class Archiv
  {
    public:
      char w1[256];
      char w2[256];
      char w3[256];
      char w4[256];
      char w5[256];
  };
</code></pre>
</blockquote>
<p>wird in C++ zu:</p>
<pre><code class="language-cpp">class TArchiv //guck dir vll ma Singletons an - wär hier ne Klasse Geschichte für...
{
 private:
  std::vector &lt;std::string&gt; strings;
/*ODER:*/
  std::vector &lt;std::pair &lt;std::string /*alt*/, std::string /*neu*/&gt; &gt; strings;
 public:
  void add (const std::string &amp;toadd) {strings.push_back (toadd)}
  bool search (const std::string &amp;tosearch) const {/*weiß gerad nich genau, welche std-fkt hier am besten ist...*/}
/*ODER:*/
  void replace (std::string &amp;work) const
    {
      //mit ner schleife den string durchgehen und alles ersetzen...;
    }
};
</code></pre>
<blockquote>
<pre><code>(SOCKADDR*) &amp;var
</code></pre>
</blockquote>
<p>=&gt;</p>
<pre><code>(SOCKADDR*)
&amp;
var
</code></pre>
<p>also das gleiche, wie:</p>
<pre><code>T1 *pointer_auf_var = &amp;var;
T2 *pointer_wie_ihn_die_fkt_erwartet = (T2*)T1;
</code></pre>
<blockquote>
<pre><code class="language-cpp">namespace ProtoTypes
{
  long handle;
  ConnectionS connection;
/*...*/
}
</code></pre>
</blockquote>
<p>globale variablen sucken! und wenn du sie schon nimmst (und in 2 Threads gleichzeitig schreiben und lesen willst), dann solltest du darauf achten, dass sie durch einen Mutex o.ä. geschützt sind... Sonst kann es passieren, dass der Thread zum Lesen gerade anfängt mit lesen, wenn der andere Thread gerade schon ein stück der variable geändert hat - und den rest noch nicht...</p>
<blockquote>
<pre><code class="language-cpp">while (handle != SOCKET_ERROR)
  {
    gets (data_send);
    if (string_spam (data_send))
      handle = send (connection.sock_specified, data_send, strlen(data_send), 0);
    else
      cout &lt;&lt; &quot;Spamfilter blockiert die gesendete Nachricht!\n&quot;;
/*    if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Senden von Datenpaketen!\nZum Beenden ENTER druecken...&quot;;
     break;
    } hier nicht...*/
  }
//das stück kannst du auch hier hinschreiben ohne das if...
</code></pre>
</blockquote>
<blockquote>
<p>HEADER-Datei</p>
<pre><code class="language-cpp">using namespace std;
</code></pre>
</blockquote>
<p>Niemals using namespace in headern...</p>
<blockquote>
<pre><code class="language-cpp">class ConnectionS
{
  private:
    WSADATA wsa;
    SOCKADDR_IN server;
    long handle;
  public:
    SOCKET sock_main, sock_specified;
    ConnectionS();
    ~ConnectionS();
};

class ConnectionC
{
  private:
    WSADATA wsa;
    SOCKADDR_IN server;
    long handle;
  public:
    SOCKET sock;
    ConnectionC();
    ~ConnectionC();
};
</code></pre>
</blockquote>
<p>1. fällt dir was auf? die sehen fast gleich aus, oder? Vll guckste dir mal das Ableiten an?<br />
2. brauchst du die daten doch hier gar nicht so wirklich... WSADATA reicht doch im CTor einmal - oder guckst du dir das jemals an bzw lässt es ausgeben oä?</p>
<pre><code class="language-cpp">struct TSocket
	{
		SOCKET socket_number;

		TSocket (SOCKET _sock = SOCKET_ERROR)
			: socket_number (_sock)														{};

		bool operator == (const TSocket &amp;other) const									{return (socket_number == other.socket_number);};
		bool operator != (const TSocket &amp;other) const									{return (socket_number != other.socket_number);};
		template &lt;typename T&gt;
			friend T&amp; operator &lt;&lt; (T &amp;stream, const TSocket &amp;these)						{return (stream &lt;&lt; (unsigned int) these.socket_number);};
	};
</code></pre>
<p>Ist da vll schon mal nen ganz guter Ansatz... Wenn du was nicht verstehst, dann sag es halt...</p>
<p>Wenn du das alles hast, dann kannste ja noch mal schreiben, wie du es dann hast und so... Aber ich hab jetzt gerad keine Lust mehr, mir noch mehr anzugucken...<br />
Ich meine - wahrscheinlich geht es und du denkst dir eh: &quot;ach - lass ihn quatschen... es geht und was will ich mehr&quot;... aber der stil ist... naja ^^</p>
<p>Aber les wenigstens das, was ich hier schreib, bevor du die nächste Lösung postest...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559886</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559886</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 05 Aug 2008 21:16:49 GMT</pubDate></item></channel></rss>