<?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[Parallelabläufe realisieren]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>erst mal möchte ich mich herzlich bedanken für die Antworten auf meine gestellten Fragen im letzten Thread (Socketprogrammierung)!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich mache das in diesem Thread, da der letzte mittlerweile ja schon überholt ist <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>Nun noch eine Frage zu dem Ablauf eines Programms.</p>
<p>Hierzu erst einmal wieder die zwei Dateien (mittlerweile etwas umgeschrieben):</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;

//---------------------------------------------------------------------------------------------------||||Prototypen deklarieren

int WinSockStart();

int main()
{
  long handle;
  SOCKET sock_main, sock_specified;
  SOCKADDR_IN server;
  char data_sent[300], data_received[300];

  memset(&amp;server, 0, sizeof(SOCKADDR_IN));

  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = ADDR_ANY;

//---------------------------------------------------------------------------------------------------||||Vorarbeit für Socketnutzung erledigen

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSockStart wurde nicht erfolgreich ausgeführt!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;WinSock gestartet...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket erstellen

  sock_main = socket(AF_INET, SOCK_STREAM, 0);

  if(sock_main == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket erstellt...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket an Server binden

  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!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket wurde an den Server gebunden...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Auf Kunden warten

  handle = listen(sock_main, 10);

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Socketfunktion Listen konnte nicht richtig aufgerufen werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Server lauscht...&quot; &lt;&lt; '\n';  

//---------------------------------------------------------------------------------------------------||||Entdeckte Kunden akzeptieren

  sock_specified = accept(sock_main, NULL, NULL);

  if(sock_specified == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Server konnte nicht mit Client verbunden werden!&quot; &lt;&lt; '\n';
  else
  {
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert...&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
    cout &lt;&lt; &quot;---Chatbereich---&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
  }

//---------------------------------------------------------------------------------------------------||||Daten senden &amp; empfangen

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock_specified, data_received, 256, 0);
    if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung abgebrochen!&quot; &lt;&lt; '\n';
     break;
    }
    else if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!&quot; &lt;&lt; '\n';
     break;
    }
    data_received[handle] = '\0';
    cout &lt;&lt; '\n' &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
    cout &lt;&lt; &quot;&lt;- &quot;;
    gets(data_sent);
    handle = send(sock_specified, data_sent, strlen(data_sent), 0);
  }
  closesocket(sock_main);
  closesocket(sock_specified);
  WSACleanup();
  system(&quot;pause&gt;nul&quot;);
 return 0;
}

//---------------------------------------------------------------------------------------------------||||Funktionen

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}
</code></pre>
<p>Client.cpp</p>
<pre><code>//Client.cpp

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

using namespace std;

//---------------------------------------------------------------------------------------------------||||Prototypen deklarieren

int WinSockStart();

int main()
{
  long handle;
  SOCKET sock;
  SOCKADDR_IN server;
  char data_sent[300], data_received[256];

  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;84.158.36.172&quot;);

//---------------------------------------------------------------------------------------------------||||Vorarbeit für Socketnutzung erledigen

  handle = WinSockStart();

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSockStart wurde nicht erfolgreich ausgeführt!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;WinSock gestartet...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket erstellen

  sock = socket(AF_INET, SOCK_STREAM, 0);

  if(sock == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket erstellt...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Server kontaktieren

  handle = connect(sock, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Verbindung konnte nicht hergestellt werden!&quot; &lt;&lt; '\n';
  else
  {
    cout &lt;&lt; &quot;Verbindung hergestellt...&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
    cout &lt;&lt; &quot;---Chatbereich---&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
  }

//---------------------------------------------------------------------------------------------------||||Daten senden &amp; empfangen

  while(handle != SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;&lt;- &quot;;
    gets(data_sent);
    send(sock, data_sent, strlen(data_sent), 0);
    handle = recv(sock, data_received, 256, 0);
    if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung abgebrochen!&quot; &lt;&lt; '\n';
     break;
    }
    else if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!&quot; &lt;&lt; '\n';
     break;
    }
    data_received[handle] = '\0';
    cout &lt;&lt; '\n' &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
  }
  system(&quot;pause&gt;nul&quot;);
 return 0;
}

//---------------------------------------------------------------------------------------------------||||Funktionen

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}
</code></pre>
<p>Wer sich die zwei Dateien nun aufmerksam durchgelesen hat, wird schnell feststellen, dass man immer nur abwechelnd Server-Client-Server-Client schreiben kann, d.h der Client kann beispielsweise nicht 2 mal hintereinander schreiben, ohne dass der Server dazwischenfunken muss.<br />
Doch um zwei seperate while-Schleifen (eine fürs Empfangen, eine fürs Senden) laufen zu lassen, bräuchte ich doch so etwas wie einen Timer, oder mit Threads ist das anscheinend auch realisierbar, aber ich habe leider keine Ahnung wie! <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=":confused:"
      alt="😕"
    /></p>
<p>In meinem Buch habe ich nach Threads sowie nach Timern &quot;gegoogelt&quot;, jedoch erfolglos!</p>
<p>Könnte mir da vielleicht jemand einen Lösungsansatz bringen?<br />
Wäre echt nett!</p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219021/parallelabläufe-realisieren</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Apr 2026 18:23:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219021.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Jul 2008 18:53:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Parallelabläufe realisieren on Mon, 28 Jul 2008 18:53:16 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>erst mal möchte ich mich herzlich bedanken für die Antworten auf meine gestellten Fragen im letzten Thread (Socketprogrammierung)!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich mache das in diesem Thread, da der letzte mittlerweile ja schon überholt ist <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>Nun noch eine Frage zu dem Ablauf eines Programms.</p>
<p>Hierzu erst einmal wieder die zwei Dateien (mittlerweile etwas umgeschrieben):</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;

//---------------------------------------------------------------------------------------------------||||Prototypen deklarieren

int WinSockStart();

int main()
{
  long handle;
  SOCKET sock_main, sock_specified;
  SOCKADDR_IN server;
  char data_sent[300], data_received[300];

  memset(&amp;server, 0, sizeof(SOCKADDR_IN));

  server.sin_family = AF_INET;
  server.sin_port = htons(12345);
  server.sin_addr.s_addr = ADDR_ANY;

//---------------------------------------------------------------------------------------------------||||Vorarbeit für Socketnutzung erledigen

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSockStart wurde nicht erfolgreich ausgeführt!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;WinSock gestartet...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket erstellen

  sock_main = socket(AF_INET, SOCK_STREAM, 0);

  if(sock_main == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket erstellt...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket an Server binden

  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!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket wurde an den Server gebunden...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Auf Kunden warten

  handle = listen(sock_main, 10);

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Socketfunktion Listen konnte nicht richtig aufgerufen werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Server lauscht...&quot; &lt;&lt; '\n';  

//---------------------------------------------------------------------------------------------------||||Entdeckte Kunden akzeptieren

  sock_specified = accept(sock_main, NULL, NULL);

  if(sock_specified == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Server konnte nicht mit Client verbunden werden!&quot; &lt;&lt; '\n';
  else
  {
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert...&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
    cout &lt;&lt; &quot;---Chatbereich---&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
  }

//---------------------------------------------------------------------------------------------------||||Daten senden &amp; empfangen

  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock_specified, data_received, 256, 0);
    if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung abgebrochen!&quot; &lt;&lt; '\n';
     break;
    }
    else if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!&quot; &lt;&lt; '\n';
     break;
    }
    data_received[handle] = '\0';
    cout &lt;&lt; '\n' &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
    cout &lt;&lt; &quot;&lt;- &quot;;
    gets(data_sent);
    handle = send(sock_specified, data_sent, strlen(data_sent), 0);
  }
  closesocket(sock_main);
  closesocket(sock_specified);
  WSACleanup();
  system(&quot;pause&gt;nul&quot;);
 return 0;
}

//---------------------------------------------------------------------------------------------------||||Funktionen

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}
</code></pre>
<p>Client.cpp</p>
<pre><code>//Client.cpp

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

using namespace std;

//---------------------------------------------------------------------------------------------------||||Prototypen deklarieren

int WinSockStart();

int main()
{
  long handle;
  SOCKET sock;
  SOCKADDR_IN server;
  char data_sent[300], data_received[256];

  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;84.158.36.172&quot;);

//---------------------------------------------------------------------------------------------------||||Vorarbeit für Socketnutzung erledigen

  handle = WinSockStart();

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSockStart wurde nicht erfolgreich ausgeführt!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;WinSock gestartet...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket erstellen

  sock = socket(AF_INET, SOCK_STREAM, 0);

  if(sock == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket erstellt...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Server kontaktieren

  handle = connect(sock, (SOCKADDR*)&amp;server, sizeof(SOCKADDR));

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Verbindung konnte nicht hergestellt werden!&quot; &lt;&lt; '\n';
  else
  {
    cout &lt;&lt; &quot;Verbindung hergestellt...&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
    cout &lt;&lt; &quot;---Chatbereich---&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
  }

//---------------------------------------------------------------------------------------------------||||Daten senden &amp; empfangen

  while(handle != SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;&lt;- &quot;;
    gets(data_sent);
    send(sock, data_sent, strlen(data_sent), 0);
    handle = recv(sock, data_received, 256, 0);
    if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung abgebrochen!&quot; &lt;&lt; '\n';
     break;
    }
    else if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!&quot; &lt;&lt; '\n';
     break;
    }
    data_received[handle] = '\0';
    cout &lt;&lt; '\n' &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
  }
  system(&quot;pause&gt;nul&quot;);
 return 0;
}

//---------------------------------------------------------------------------------------------------||||Funktionen

int WinSockStart()
{
  WSADATA wsa;
 return WSAStartup(MAKEWORD(2,2), &amp;wsa);
}
</code></pre>
<p>Wer sich die zwei Dateien nun aufmerksam durchgelesen hat, wird schnell feststellen, dass man immer nur abwechelnd Server-Client-Server-Client schreiben kann, d.h der Client kann beispielsweise nicht 2 mal hintereinander schreiben, ohne dass der Server dazwischenfunken muss.<br />
Doch um zwei seperate while-Schleifen (eine fürs Empfangen, eine fürs Senden) laufen zu lassen, bräuchte ich doch so etwas wie einen Timer, oder mit Threads ist das anscheinend auch realisierbar, aber ich habe leider keine Ahnung wie! <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=":confused:"
      alt="😕"
    /></p>
<p>In meinem Buch habe ich nach Threads sowie nach Timern &quot;gegoogelt&quot;, jedoch erfolglos!</p>
<p>Könnte mir da vielleicht jemand einen Lösungsansatz bringen?<br />
Wäre echt nett!</p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555228</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555228</guid><dc:creator><![CDATA[Gapa]]></dc:creator><pubDate>Mon, 28 Jul 2008 18:53:16 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelabläufe realisieren on Mon, 28 Jul 2008 19:23:37 GMT]]></title><description><![CDATA[<blockquote>
<p>In meinem Buch habe ich nach Threads sowie nach Timern &quot;gegoogelt&quot;, jedoch erfolglos!</p>
</blockquote>
<p>Man kann in einem Buch nicht googeln <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>
<p>Für Threads erstellst du einfach Funktionen die du dann mit einem Thread aufrufst, dieser läuft dann parallel zu main Funktion.</p>
<p>Unter Windows kannst du entweder mit CreateThread einen Thread erstellen -&gt; <a href="http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx" rel="nofollow">http://msdn.microsoft.com/en-us/library/ms682453(VS.85).aspx</a><br />
Oder du verwendest Boost um gleich noch Plattforumübergreifend zu arbeiten, oder unter Linux POSIX Threads.</p>
<p>Um die nächste Frage gleich schonmal vorweg zunehmen, mehrere Clients behandelst du auf dem Server mit select, mehr dazu gibts bei <a href="http://www.c-worker.ch/" rel="nofollow">http://www.c-worker.ch/</a></p>
<p>MFG ReduX</p>
<p>P.S.: Ich habe die beiden Dateien nicht gelesen also vergib mir wenn du select schon eingebaut hast.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555239</guid><dc:creator><![CDATA[ReduX]]></dc:creator><pubDate>Mon, 28 Jul 2008 19:23:37 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelabläufe realisieren on Tue, 29 Jul 2008 09:33:11 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Super vielen Dank für die Links!!! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ok ich habe mir das in der MSDN mal angeschaut und versucht, in mein Script einzubauen:</p>
<p>Server.cpp</p>
<pre><code>//Server.cpp

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

using namespace std;

//---------------------------------------------------------------------------------------------------||||Prototypen deklarieren

int WinSockStart();
DWORD WINAPI thread_send(LPVOID);
DWORD WINAPI thread_receive(LPVOID);

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;

//---------------------------------------------------------------------------------------------------||||Vorarbeit für Socketnutzung erledigen

  handle = WinSockStart();
  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! WinSockStart wurde nicht erfolgreich ausgeführt!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;WinSock gestartet...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket erstellen

  sock_main = socket(AF_INET, SOCK_STREAM, 0);

  if(sock_main == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Socket konnte nicht erstellt werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket erstellt...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Socket an Server binden

  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!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Socket wurde an den Server gebunden...&quot; &lt;&lt; '\n';

//---------------------------------------------------------------------------------------------------||||Auf Kunden warten

  handle = listen(sock_main, 10);

  if(handle == SOCKET_ERROR)
    cout &lt;&lt; &quot;Fehler! Socketfunktion Listen konnte nicht richtig aufgerufen werden!&quot; &lt;&lt; '\n';
  else
    cout &lt;&lt; &quot;Server lauscht...&quot; &lt;&lt; '\n';  

//---------------------------------------------------------------------------------------------------||||Entdeckte Kunden akzeptieren

  sock_specified = accept(sock_main, NULL, NULL);

  if(sock_specified == INVALID_SOCKET)
    cout &lt;&lt; &quot;Fehler! Server konnte nicht mit Client verbunden werden!&quot; &lt;&lt; '\n';
  else
  {
    cout &lt;&lt; &quot;Neue Verbindung akzeptiert...&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
    cout &lt;&lt; &quot;---Chatbereich---&quot; &lt;&lt; '\n' &lt;&lt; '\n' &lt;&lt; '\n';
  }

//---------------------------------------------------------------------------------------------------||||Daten senden &amp; empfangen
  HANDLE thread_handle1 = CreateThread(NULL, 0, thread_send, 0, 0, 0);
  HANDLE thread_handle2 = CreateThread(NULL, 0, thread_receive, 0, 0, 0);
  WaitForSingleObject(thread_handle1, INFINITE);
  WaitForSingleObject(thread_handle2, INFINITE);
  closesocket(sock_main);
  closesocket(sock_specified);
  WSACleanup();
  system(&quot;pause&gt;nul&quot;);
 return 0;
}

//---------------------------------------------------------------------------------------------------||||Funktionen

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

void thread_send()
{
  char data_sent[300];
  while(handle != SOCKET_ERROR)
  {
    cout &lt;&lt; &quot;&lt;- &quot;;
    gets(data_sent);
    handle = send(sock_specified, data_sent, strlen(data_sent), 0);
  }
}

void thread_receive()
{
  char data_received[300];
  while(handle != SOCKET_ERROR)
  {
    handle = recv(sock_specified, data_received, 256, 0);
    if(handle == 0)
    {
      cout &lt;&lt; &quot;Gegenseite hat die Verbindung abgebrochen!&quot; &lt;&lt; '\n';
     break;
    }
    else if(handle == SOCKET_ERROR)
    {
      cout &lt;&lt; &quot;Fehler beim Empfangen von Datenpaketen!&quot; &lt;&lt; '\n';
     break;
    }
    data_received[handle] = '\0';
    cout &lt;&lt; '\n' &lt;&lt; &quot;-&gt; &quot; &lt;&lt; data_received &lt;&lt; '\n';
  }
}
</code></pre>
<p>1. Ist das der richtige Weg?</p>
<p>2. Mein Linker spuckt folgende Fehlermeldungen aus:</p>
<blockquote>
<p>[Linker error] undefined reference to <code>\_Z11thread\_sendPv@4' \[Linker error\] undefined reference to</code>_Z14thread_receivePv@4'<br />
ld returned 1 exit status<br />
C:\*****\Makefile.win [Build Error] [Server.exe] Error 1</p>
</blockquote>
<p>Welche Dateien muss ich noch mit einincludieren??</p>
<p>Aber noch viel wichtiger wäre mir eine Antwort auf Frage 1!<br />
Ist mein Gedankengang hier richtig, oder würde dieses Script nicht laufen, wie es soll??</p>
<blockquote>
<p>Man kann in einem Buch nicht googeln</p>
</blockquote>
<p>Ja das weiß ich auch <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="😃"
    /> - deswegen ja die &quot;&quot;!</p>
<p>Viele Grüße<br />
Gapa</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555482</guid><dc:creator><![CDATA[Gapa]]></dc:creator><pubDate>Tue, 29 Jul 2008 09:33:11 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelabläufe realisieren on Tue, 29 Jul 2008 17:43:00 GMT]]></title><description><![CDATA[<p>1.) Im Prinzip würde es gehen, aber der Server würde sich schließen sobald der Kunde disconnected.</p>
<p>zu 2.) Ein heller Satz aus der msdn: Do not declare this callback function with a void return type and cast the function pointer to LPTHREAD_START_ROUTINE when creating the thread. Code that does this is common, but it can crash on 64-bit Windows.</p>
<p>Das heißt schonmal das die Threads so gestartet werden:</p>
<pre><code class="language-cpp">HANDLE thread_handle1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)&amp;thread_send, 0, 0, 0);
  HANDLE thread_handle2 = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE)&amp;thread_receive, 0, 0, 0);
</code></pre>
<p>Des weiteren hast du die beiden Funktionen so definiert:</p>
<pre><code class="language-cpp">DWORD WINAPI thread_send(LPVOID);
DWORD WINAPI thread_receive(LPVOID);
</code></pre>
<p>Das sollte man dann halt auch unten schreiben und nicht void thread_send();</p>
<p>Ich würde dir aber raten wenn du mit Socket arbeitest das du die in eine Klasse packst, glaub mir das hat viele Vorteile. Musste nur schauen wegen den Threads da die WinAPI für C ist, unterstützen die keine Klassen. Muss man halt en bisschen rumhacken oder bis nächstes Jahr warten.</p>
<p>MFG ReduX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1555851</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1555851</guid><dc:creator><![CDATA[ReduX]]></dc:creator><pubDate>Tue, 29 Jul 2008 17:43:00 GMT</pubDate></item><item><title><![CDATA[Reply to Parallelabläufe realisieren on Wed, 30 Jul 2008 10:29:38 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-403.html" rel="nofollow">HumeSikkins</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html" rel="nofollow">WinAPI</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1556255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1556255</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 30 Jul 2008 10:29:38 GMT</pubDate></item></channel></rss>