<?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[Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung)]]></title><description><![CDATA[<p>Ich habe mich mal an der Tutorial von <a href="http://www.c-worker.ch" rel="nofollow">www.c-worker.ch</a> gewagt.</p>
<p>Darin geht es um TCP/UDP Socket Programmierung (wie der Titel vermuten lässt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> wer hätt's gedacht :D)</p>
<p>Mein Problem kann ich leider schlecht schildern - daher möchte ich mal ein Beispiel geben.</p>
<p>Ich habe folgenden Code (Client):</p>
<pre><code class="language-cpp">int main(int argc, char* argv[])
{
   long rc;
   SOCKET s;
   SOCKADDR_IN addr;

   WSAStartup(...);
   socket(...);
   getAddrFromString(ServerName, &amp;addr);

   connect(...);

char buf[256];
// Daten austauschen
while(rc != SOCKET_ERROR)
{
   printf(&quot;\nZeichenfolge eingeben [max 256]: &quot;);
   gets(buf);
   send(s, buf,strlen(buf), 0);
   rc = recv(s, buf, 256, 0);
   if (rc == 0)
   {
      printf(&quot;Server hat die Verbindung getrennt..\n&quot;);
      break;
   }
   if (rc == SOCKET_ERROR)
   {
      printf(&quot;Fehler: recv, fehler code: %d\n&quot;, WSAGetLastError());
      break;
   }
   buf[rc] = '\0';
   printf(&quot;\nServer antwortet: %s\n&quot;, buf);
}

   closesocket(...);
   WSACleanup(...);
}
</code></pre>
<p>Der Code vom Server sieht sehr ähnlich aus ... wenn der Server etwas vom Client zugeschickt bekommt führt er <strong>zweimal</strong> die Funktion send(...);</p>
<p>Das Problem ist nun, dass der Client nachdem er was gesendet hat, genau <strong>eine</strong> Nachricht empfangen kann. Selbst, wenn keine Atwort folgen würde, blockiert die Funktion recv(...);, sodass der Client nichts mehr Senden kann.</p>
<p>Also der Client kann nur senden - empfangen - senden - empfangen - senden - usw...</p>
<p>z.B. das ist nicht möglich: empfangen - empfangen - empfangen</p>
<p>Wie kann man das Problem lösen ... möglichst ohne timeout und Threads oder Prozessen.</p>
<p>Bin über Hilfe sehr Dankbar!</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202202/frage-zu-tutorial-von-www-c-worker-ch-tcp-udp-socket-programmierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 18:27:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202202.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jan 2008 19:39:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Tue, 08 Jan 2008 19:39:25 GMT]]></title><description><![CDATA[<p>Ich habe mich mal an der Tutorial von <a href="http://www.c-worker.ch" rel="nofollow">www.c-worker.ch</a> gewagt.</p>
<p>Darin geht es um TCP/UDP Socket Programmierung (wie der Titel vermuten lässt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> wer hätt's gedacht :D)</p>
<p>Mein Problem kann ich leider schlecht schildern - daher möchte ich mal ein Beispiel geben.</p>
<p>Ich habe folgenden Code (Client):</p>
<pre><code class="language-cpp">int main(int argc, char* argv[])
{
   long rc;
   SOCKET s;
   SOCKADDR_IN addr;

   WSAStartup(...);
   socket(...);
   getAddrFromString(ServerName, &amp;addr);

   connect(...);

char buf[256];
// Daten austauschen
while(rc != SOCKET_ERROR)
{
   printf(&quot;\nZeichenfolge eingeben [max 256]: &quot;);
   gets(buf);
   send(s, buf,strlen(buf), 0);
   rc = recv(s, buf, 256, 0);
   if (rc == 0)
   {
      printf(&quot;Server hat die Verbindung getrennt..\n&quot;);
      break;
   }
   if (rc == SOCKET_ERROR)
   {
      printf(&quot;Fehler: recv, fehler code: %d\n&quot;, WSAGetLastError());
      break;
   }
   buf[rc] = '\0';
   printf(&quot;\nServer antwortet: %s\n&quot;, buf);
}

   closesocket(...);
   WSACleanup(...);
}
</code></pre>
<p>Der Code vom Server sieht sehr ähnlich aus ... wenn der Server etwas vom Client zugeschickt bekommt führt er <strong>zweimal</strong> die Funktion send(...);</p>
<p>Das Problem ist nun, dass der Client nachdem er was gesendet hat, genau <strong>eine</strong> Nachricht empfangen kann. Selbst, wenn keine Atwort folgen würde, blockiert die Funktion recv(...);, sodass der Client nichts mehr Senden kann.</p>
<p>Also der Client kann nur senden - empfangen - senden - empfangen - senden - usw...</p>
<p>z.B. das ist nicht möglich: empfangen - empfangen - empfangen</p>
<p>Wie kann man das Problem lösen ... möglichst ohne timeout und Threads oder Prozessen.</p>
<p>Bin über Hilfe sehr Dankbar!</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433268</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Tue, 08 Jan 2008 19:39:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Tue, 08 Jan 2008 23:01:18 GMT]]></title><description><![CDATA[<p>In dem Tutorial war afaik auch irgendwo erklärt wie die Funktion select() funktioniert. Damit kannst man Einstellen das recv() nur eine gewisse Zeit wartet. Allerdings hast du dann in deinem Fall noch das Problem das du dann etwas eingeben müsstest, weil sonst gets() den weiteren Ablauf unterbricht. Aber das könntest du mit kbhit() abfangen und nur einlesen, wenn der Benutzer etwas getippt hat.</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433350</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Tue, 08 Jan 2008 23:01:18 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Tue, 08 Jan 2008 23:47:43 GMT]]></title><description><![CDATA[<p>Vellas schrieb:</p>
<blockquote>
<p>In dem Tutorial war afaik auch irgendwo erklärt wie die Funktion select() funktioniert. Damit kannst man Einstellen das recv() nur eine gewisse Zeit wartet. Allerdings hast du dann in deinem Fall noch das Problem das du dann etwas eingeben müsstest, weil sonst gets() den weiteren Ablauf unterbricht. Aber das könntest du mit kbhit() abfangen und nur einlesen, wenn der Benutzer etwas getippt hat.</p>
<p>Greetz</p>
</blockquote>
<p>recv blockiert immer, es sei denn du hast non-blocking sockets. select blockiert<br />
entweder so lange, bis auf einen Descriptor wieder geschrieben/gelesen werden<br />
kann, oder aber bis ein evtl. angegebener timeout abgelaufen ist. recv hat damit<br />
zunaechst einmal nichts zu tun.</p>
<blockquote>
<p>Wie kann man das Problem lösen ... möglichst ohne timeout und Threads oder Prozessen.</p>
</blockquote>
<p>Entweder benutzt du non-blocking sockets oder du verwendest select und stellst<br />
den timeout auf 0. Damit kannst du dann zu deiner Anwendung wieder zurueck-<br />
kehren, wenn aktuell keine Daten im Empfangspuffer zur Abholung warten. Wenn<br />
du auf non-blocking setzt (siehe setsockopt), dann liefert dir recv EWOULDBLOCK<br />
zurueck, wenn derzeit keine Daten vorhanden sind. Wenn du select benutzt,<br />
uebergibst du select ein SET derjenigen Descriptoren, die du darauf pruefen<br />
moechtest, ob von einem von ihnen gelesen werden kann. Zusaetzlich kann man<br />
select einen Timeout-Parameter mitgeben. Ist dieser 0, verhaelt sich die<br />
select-recv-Variante aehnlich, wie non-blocking sockets. Siehe dazu in der<br />
select-Manpage oder in der MSDN. Selbiges gilt fuer non-blocking sockets.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433354</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Tue, 08 Jan 2008 23:47:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 00:16:13 GMT]]></title><description><![CDATA[<p>Das tolle an der bisherigen Möglichkeit war doch, dass in der Zeit, wo die recv(...); Funktion &quot;festhängt&quot; keine CPU ausgelastet wird.</p>
<p>So wie ich das verstanden habe wird bei beiden vorgeschlagenen Möglichkeiten (non-blocking sockets, timeout 0) nachgeschaut, ob neue Nachrichten da sind und wenn nicht, wird im Programmcode weitergegangen. Jetzt würde er schauen, ob ausgehende Nachrichten da sind und wenn auch keine zu sendenden Nachrichten vorhanden sind, wird ebenso weiter gesprungen. Das heißt der Rechner rattert und rumpelt, obwohl er nichts macht ...</p>
<p>Gibt es keine Lösung, die meinen Erwartungen entspricht?</p>
<p>Sollte ich doch auf Threads oder Prozesse setzten? Der eine, welcher immer send(...); ausführt und der andere recv(...); ? Oder gibt es dabei komplicationen (denke gerade dran, dass man ja keine critical sections machen kann ... hm)?</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433356</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 00:16:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 10:07:48 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-8.html" rel="nofollow">Rund um die Programmierung</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/1433497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433497</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Wed, 09 Jan 2008 10:07:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 10:39:14 GMT]]></title><description><![CDATA[<p>virtuell Realisticer schrieb:</p>
<blockquote>
<p>recv blockiert immer, es sei denn du hast non-blocking sockets. select blockiert<br />
entweder so lange, bis auf einen Descriptor wieder geschrieben/gelesen werden<br />
kann, oder aber bis ein evtl. angegebener timeout abgelaufen ist. recv hat damit<br />
zunaechst einmal nichts zu tun.</p>
</blockquote>
<p>Ja weiß ich. Das mit dem eingestellten Timeout für einen Descriptor war halt das was ich meinte, bei der Erwähnung von select().</p>
<p>Thomas_ schrieb:</p>
<blockquote>
<p>Das tolle an der bisherigen Möglichkeit war doch, dass in der Zeit, wo die recv(...); Funktion &quot;festhängt&quot; keine CPU ausgelastet wird.</p>
</blockquote>
<p>Du musst den Timeout ja nicht unbedingt auf 0 setzen. Dann ist die CPU auch nicht die ganze Zeit ausgelastet.</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433525</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 09 Jan 2008 10:39:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:04:05 GMT]]></title><description><![CDATA[<p>@ Vellas:<br />
das mit dem Timeout mag richtig sein ... ich bin dir auch für diese mögliche Lösung dankbar ... dennoch finde ich, dass trotzdem CPU Last &quot;verschwendet&quot; wird.</p>
<p>Ewtl. ist es zu perfektionistisch aber ich möchte das ganze möglichst CPU schonend machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433583</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:04:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:15:56 GMT]]></title><description><![CDATA[<p>gib einfach gar keinen timeout für select an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433588</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433588</guid><dc:creator><![CDATA[vela]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:15:56 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:27:49 GMT]]></title><description><![CDATA[<p>@ vela:<br />
wenn ich kein timeout für select angebe, wird select eine blocking Funktions und &quot;fährt das ganze programm fest&quot; ....</p>
<p>und dann kann ich ja nichts mehr senden ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433595</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:27:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:41:41 GMT]]></title><description><![CDATA[<p>select kehrt doch zurück wenn ein socket beschreibbar wird!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433602</guid><dc:creator><![CDATA[vela]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:41:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:47:00 GMT]]></title><description><![CDATA[<p>Thomas_ schrieb:</p>
<blockquote>
<p>@ Vellas:<br />
das mit dem Timeout mag richtig sein ... ich bin dir auch für diese mögliche Lösung dankbar ... dennoch finde ich, dass trotzdem CPU Last &quot;verschwendet&quot; wird.</p>
<p>Ewtl. ist es zu perfektionistisch aber ich möchte das ganze möglichst CPU schonend machen...</p>
</blockquote>
<p>Das ist zu vernachlaessigen. Probier es aus! Ein paar Millesekunden sind fuer<br />
die CPU Ewigkeiten, da geht die Last nicht sonderlich hoch.</p>
<p>Eine andere Moeglichkeit bleibt dir nicht, es sei denn, du willst mit Threads<br />
oder mehreren Prozessen arbeiten, die fuer sich natuerlich ruhig blockieren<br />
duerfen, hauptsache die Mainloop ist nicht davon betroffen.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433606</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:47:00 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 12:46:49 GMT]]></title><description><![CDATA[<p>Thomas_ schrieb:</p>
<blockquote>
<p>@ vela:<br />
wenn ich kein timeout für select angebe, wird select eine blocking Funktions und &quot;fährt das ganze programm fest&quot; ....</p>
<p>und dann kann ich ja nichts mehr senden ...</p>
</blockquote>
<p>Das ist so nicht ganz korrekt. select wird *nur* unter der Voraussetzung, dass<br />
der Timeout-Parameter NULL ist, blockierend.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433611</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Wed, 09 Jan 2008 12:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 13:06:01 GMT]]></title><description><![CDATA[<p>Wo ist den der Unterschied zwischen &quot;Timeout-Parameter NULL&quot; und &quot;kein timeout für select&quot;?</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433621</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 13:06:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 13:12:45 GMT]]></title><description><![CDATA[<p>Thomas_ schrieb:</p>
<blockquote>
<p>Wo ist den der Unterschied zwischen &quot;Timeout-Parameter NULL&quot; und &quot;kein timeout für select&quot;?</p>
<p>LG</p>
</blockquote>
<p>Das ist aequivalent. Wenn du als Timeout-Parameter &quot;NULL&quot; bzw. &quot;0&quot; uebergibst,<br />
dann kann select u. U. fuer eine nicht definierbar lange Zeitspanne blockieren.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1433626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433626</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Wed, 09 Jan 2008 13:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 19:06:43 GMT]]></title><description><![CDATA[<p>Dann versteh ich aber in dem Beitrag (<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-158175-and-highlight-is-host+port.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-158175-and-highlight-is-host+port.html</a>)</p>
<p>diese Aussage nicht:</p>
<blockquote>
<p>// prüfen ob ein socket bereit ist, da timeout=0 kehrt die funktion<br />
// sofort wieder zurück nach dem aufruf.<br />
<strong>// achtung: das timeout auf 0 setzen oder als paremeter NULL mitgeben<br />
// ist NICHT das gleiche. auf 0 gesetzt kehrt sofort zurück, während<br />
// NULL blockt.</strong></p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1433884</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1433884</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 19:06:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 22:17:32 GMT]]></title><description><![CDATA[<p>Thomas_ schrieb:</p>
<blockquote>
<p>Dann versteh ich aber in dem Beitrag (<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-158175-and-highlight-is-host+port.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-158175-and-highlight-is-host+port.html</a>)</p>
<p>diese Aussage nicht:</p>
<blockquote>
<p>// prüfen ob ein socket bereit ist, da timeout=0 kehrt die funktion<br />
// sofort wieder zurück nach dem aufruf.<br />
<strong>// achtung: das timeout auf 0 setzen oder als paremeter NULL mitgeben<br />
// ist NICHT das gleiche. auf 0 gesetzt kehrt sofort zurück, während<br />
// NULL blockt.</strong></p>
</blockquote>
</blockquote>
<p>Moment, da verwechselst du etwas. select hat die folgende Signatur:</p>
<pre><code class="language-cpp">int select(int nfds, fd_set *restrict readfds,
           fd_set *restrict writefds, fd_set *restrict errorfds,
           struct timeval *restrict timeout);
</code></pre>
<p>Uebergibst du fuer timeout &quot;NULL&quot; bzw. &quot;0&quot;, dann setzt du den Zeiger auf den<br />
Nullpointer. In dem Artikel meinen die aber, den timeout per timeval-Parameter<br />
auf 0 zu setzen, d. h. es wird eine timeval-Struktur uebergeben, deren Member<br />
0 sind.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434010</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434010</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Wed, 09 Jan 2008 22:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Wed, 09 Jan 2008 23:12:32 GMT]]></title><description><![CDATA[<p>@ virtuell Realisticer:</p>
<p>OK den Unterschied verstehe ich!<br />
und da habe ich wirklich was verwechselt/falsch verstanden.</p>
<p>Ich habe mich nun für eine Lösung mit Threads entschieden und würde gerne eure Meinung dazu hören. Wodurch könnten komplikationen entstehen? Bei mir traten bislang keine Fehler auf ...</p>
<p>Hier der Code:</p>
<pre><code class="language-cpp">bool CloseSocket(SOCKET &amp;Socket)
{
 return closesocket(Socket) &amp;&amp; WSACleanup();
}

SOCKET CreateSocket(char *ServerName, u_short Port)
{
   WSADATA wsa;
   SOCKET Socket;
   SOCKADDR_IN addr;
   long rc = WSAStartup(MAKEWORD(2,0), &amp;wsa);

   if (rc != NULL)
   {
      CloseSocket(Socket);
      return 0;
   }

   Socket = socket(AF_INET, SOCK_STREAM, 0);
   if (Socket == INVALID_SOCKET)
   {
      CloseSocket(Socket);
      return 0;
   }

   memset(&amp;addr, 0, sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
   addr.sin_family      = AF_INET;
   addr.sin_port        = htons(Port); // wir verwenden mal port 12345

   rc = getAddrFromString(ServerName, &amp;addr);
   if(rc == SOCKET_ERROR)
   {
      CloseSocket(Socket);
      return 0;
   }

   rc = connect(Socket, (SOCKADDR*)&amp;addr, sizeof(SOCKADDR));
   if (rc == SOCKET_ERROR)
   {
      CloseSocket(Socket);
      return 0;
   }
 return Socket;
}

DWORD WINAPI recvThread(LPVOID Data)
{
   char buf[256];
   long rc;
   do
   {
      rc = recv((SOCKET)Data, buf, 256, 0);
      if (rc == 0) // Server hat die Verbindung getrennt
      {
         PrintToLog(&quot;Server hat die Verbindung getrennt... [code: rc]\n&quot;);
         break;
      }
      if (rc == SOCKET_ERROR) // Fehler beim Empfangen
         break;

      buf[rc] = '\0'; // Daten erfolgreich empfangen

      PrintToLog(&quot;Server: &quot; + buf + &quot;\n&quot;);

   }
   while (rc != SOCKET_ERROR);

 return (DWORD)Data;
}

int main(int argc, char* argv[])
{
   HANDLE hThread;
   DWORD dwThreadID;

   SOCKET Socket = CreateSocket(&quot;192.168.0.19&quot;, 12345);

   if (Socket)
   {
      HANDLE hThread = CreateThread(NULL, 0, recvThread, (LPVOID)Socket, 0, 0);

         char buf[256];
         do
         {
            gets(buf);
         } while(send(Socket, buf, strlen(buf), 0) != SOCKET_ERROR);

         CloseSocket(Socket);
         CloseHandle(hThread);
   }
 return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1434025</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434025</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Wed, 09 Jan 2008 23:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 00:48:43 GMT]]></title><description><![CDATA[<p>Ein Fehler der mir schon mal aufgefallen ist: Wenn du 256 Bytes empfängst, wird in das 257ste das Null-Byte geschrieben, was dann außerhalb des Array-Bereichs ist.<br />
Wenn recv SOCKET_ERROR zurückgibt, könntest du WSAGetLastError noch auf WSAEWOULDBLOCK prüfen und in dem Fall ein continue oder so einbauen. Ich blick grad nicht durch ob recv nun blockiert oder nicht (ich persönlich hab bis jetzt immer nur mit select gearbeitet), aber verlieren tust du dabei nix: Wenn's blockiert, kannst du diesen Fehlercode gar nicht kriegen und wenn's nicht blockiert hast du's korrekt behandelt.</p>
<p>Da du ja augenscheinlich in C++ arbeitest (in C gabs doch keine Referenzen oder?), kannst du deine Variablen deklarieren wo du willst. In recvThread kannst du die rc-Variable z.B. direkt bei der Zuweisung von recv hinstecken ( <code>long rc = rc = recv(...);</code> . Du hast davon keinen &quot;direkten&quot; Vorteil, ist aber besser lesbar.</p>
<p>Ach, und in der main-Funktion hast du zwei mal die Variable hThread deklariert.</p>
<p>In CreateSocket brauchst/solltest du nicht CloseSocket aufrufen, bevor dieser überhaupt gesetzt ist <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>Um dich nicht um WSAStartup und Cleanup kümmern zu müssen, könntest du sowas in der Art verwenden:</p>
<pre><code class="language-cpp">namespace // anonymer Namensraum
{
    class WSAStartAndCleanWatcher
    {
        public:
            WSAStartAndCleanWatcher()  { /*hier das Startup rein*/ }
            ~WSAStartAndCleanWatcher() { /*hier das Cleanup rein*/ }
    };
    WSAStartAndCleanWatcher watcher;
}
</code></pre>
<p>Oder halt doch nicht in einen anonymen Namespace und eine Instanz davon am Anfang der main deklarieren.</p>
<p>Vielleicht solltest du auch noch was einbauen, dass du deinen Thread beenden kannst - jetzt wird er ja nur beendet, falls inkorrekte Daten kommen oder was mit dem Socket nicht stimmt. Und in main könntest du dann halt warten (WaitForSingleObject), bis der Thread fertig ist.</p>
<p>So, das war erstmal alles was mir aufgefallen 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>
]]></description><link>https://www.c-plusplus.net/forum/post/1434051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434051</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:48:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 12:37:14 GMT]]></title><description><![CDATA[<blockquote>
<p>Ein Fehler der mir schon mal aufgefallen ist: Wenn du 256 Bytes empfängst, wird in das 257ste das Null-Byte geschrieben, was dann außerhalb des Array-Bereichs ist.</p>
</blockquote>
<p>Ein wirklich guter Tip, der übrigends auch im Tutorial falsch ist!</p>
<blockquote>
<p>Ich blick grad nicht durch ob recv nun blockiert oder nicht</p>
</blockquote>
<p>recv blockiert! (hoffe ich erzähl nichts falsches ...)<br />
habe das geändert aber wann wird denn die Bedingung true?</p>
<pre><code class="language-cpp">if (WSAGetLastError() == WSAEWOULDBLOCK)
   continue;
</code></pre>
<blockquote>
<p>Da du ja augenscheinlich in C++ arbeitest (in C gabs doch keine Referenzen oder?), kannst du deine Variablen deklarieren wo du willst. In recvThread kannst du die rc-Variable z.B. direkt bei der Zuweisung von recv hinstecken (long rc = rc = recv(...);. Du hast davon keinen &quot;direkten&quot; Vorteil, ist aber besser lesbar.</p>
</blockquote>
<p>Laut Tutorial soll das wohl reines C gewesen sein ... ich habe den Code aber meinen Bedürfnissen angepasst und daher weiß ich nicht, in wie weit das noch C ist ... ich programmiere aber mit dem Borland C++ Builder in der Konsolenanwendung.</p>
<p>Aber: Ich versteh nicht, warum die zwei sachen gleich sein sollen?</p>
<pre><code class="language-cpp">long rc;
   do
   {
   }
   while (rc != ...);
</code></pre>
<pre><code class="language-cpp">do
   {
      long rc;
   }
   while (rc != ...);
</code></pre>
<p>wird bei der 2. Variante nicht immer wieder (bei jeden do-while &quot;loop&quot;) neuer Speicher für rc angefordert und freigegeben? bei der ersten Variante ist das doch nicht so ... und Spoeicher reservieren und freigeben kostet doch Rechenzeit!?? oder nicht? Somit müsste das doch einen - wenngleich unwesentlichen - Unterschied machen!??</p>
<pre><code>Ach, und in der main-Funktion hast du zwei mal die Variable hThread deklariert.
</code></pre>
<p>Hab ich garnicht gesehen ... Danke ... auch die Variable DWORD dwThreadID benutze ich garnicht ...</p>
<blockquote>
<p>In CreateSocket brauchst/solltest du nicht CloseSocket aufrufen, bevor dieser überhaupt gesetzt ist <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>
</blockquote>
<p>Ich verstehe, dass CloseSocket gar keinen Sinn ... Danke ... habs abgeändert!</p>
<pre><code class="language-cpp">long rc = WSAStartup(MAKEWORD(2,0), &amp;wsa);

   if (rc != NULL)
   {
      CloseSocket(Socket);
      return 0;
   }
</code></pre>
<p>Und überall sonst habe ich es durch WSACleanup(); ersetzt ... denn WSAStartup wurde ja erfolgreich ausgeführt und muss ja wieder beendet werden.</p>
<pre><code>[cpp]namespace // anonymer Namensraum
{
    class WSAStartAndCleanWatcher
    {
        public:
            WSAStartAndCleanWatcher()  { /*hier das Startup rein*/ }
            ~WSAStartAndCleanWatcher() { /*hier das Cleanup rein*/ }
    };
    WSAStartAndCleanWatcher watcher;
} [/cpp]
</code></pre>
<p>Das verstehe ich nicht ganz ... welche Funktion hat WSAStartAndCleanWatcher watcher; ? Und was ist namespace ? Damit habe ich noch nie gearbeitet ...</p>
<blockquote>
<p>Vielleicht solltest du auch noch was einbauen, dass du deinen Thread beenden kannst</p>
</blockquote>
<p>Geht sowas auch (nicht auf die &quot;harte&quot; Tour) ohne eine Globale Variable &gt;ENDE&lt;?</p>
<pre><code class="language-cpp">WaitForSingleObject(...);
</code></pre>
<p>Habe ich auch eingebaut <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>Vielen Dank!</p>
<p>Nochmal die Frage: Dadurch, dass ich mit einem Thread arbeite entstehen keine Komplikationen innerhalb der Funktion recvThread? Oder doch? ... ich habe mal gelesen, dass es Probleme gibt, wenn 2 Threads auf den gleichen Speicher zugreifen/ihn verändern/löschen ... und das recv nicht critical selection fähig ist ...</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434249</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Thu, 10 Jan 2008 12:37:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 14:47:47 GMT]]></title><description><![CDATA[<p>Thomas_ schrieb:</p>
<blockquote>
<blockquote>
<p>Ich blick grad nicht durch ob recv nun blockiert oder nicht</p>
</blockquote>
<p>recv blockiert! (hoffe ich erzähl nichts falsches ...)<br />
habe das geändert aber wann wird denn die Bedingung true?</p>
<pre><code class="language-cpp">if (WSAGetLastError() == WSAEWOULDBLOCK)
   continue;
</code></pre>
<blockquote>
<p>Da du ja augenscheinlich in C++ arbeitest (in C gabs doch keine Referenzen oder?), kannst du deine Variablen deklarieren wo du willst. In recvThread kannst du die rc-Variable z.B. direkt bei der Zuweisung von recv hinstecken (long rc = rc = recv(...);. Du hast davon keinen &quot;direkten&quot; Vorteil, ist aber besser lesbar.</p>
</blockquote>
<p>Laut Tutorial soll das wohl reines C gewesen sein ... ich habe den Code aber meinen Bedürfnissen angepasst und daher weiß ich nicht, in wie weit das noch C ist ... ich programmiere aber mit dem Borland C++ Builder in der Konsolenanwendung.</p>
<p>Aber: Ich versteh nicht, warum die zwei sachen gleich sein sollen?</p>
<pre><code class="language-cpp">long rc;
   do
   {
   }
   while (rc != ...);
</code></pre>
<pre><code class="language-cpp">do
   {
      long rc;
   }
   while (rc != ...);
</code></pre>
<p>wird bei der 2. Variante nicht immer wieder (bei jeden do-while &quot;loop&quot;) neuer Speicher für rc angefordert und freigegeben? bei der ersten Variante ist das doch nicht so ... und Spoeicher reservieren und freigeben kostet doch Rechenzeit!?? oder nicht? Somit müsste das doch einen - wenngleich unwesentlichen - Unterschied machen!??</p>
</blockquote>
<p>Da die lokalen Variablen auf dem Stack abgelegt werden, muss da kein Speicher angefordert werden, also nix Rechenzeit-Verlust <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="😉"
    /> Das Ding ist nur (war mir gestern nicht aufgefallen), dass die rc-Variable dann nicht in der while-Bedingung genutzt werden kann.<br />
Ich glaube ich würde es ungefähr so machen:</p>
<pre><code class="language-cpp">char buf[256];
while ( !quit )
{
    long rc = recv((SOCKET)Data, buf, 255, 0); // Das letzte Byte soll ja für das Null-Byte reserviert sein
    if (rc == 0) // Server hat die Verbindung getrennt
    {
        PrintToLog(&quot;Server hat die Verbindung getrennt... [code: rc]\n&quot;);
        break;
    }
    if ( rc == SOCKET_ERROR ) // Fehler beim Empfangen
    {
        if ( WsaGetLastError() == WSAEWOULDBLOCK ) // Nur gerade keine Daten da..
            continue;                              // .. also weitermachen
         break; // Sonst scheint es ein Fehler zu sein
    }

    buf[rc] = '\0'; // Daten erfolgreich empfangen

    PrintToLog(&quot;Server: &quot; + buf + &quot;\n&quot;);
}
</code></pre>
<p>Die Variable quit wird dabei von außen gesetzt, also von dem anderen Thread, im Fall dass der Thread sich beenden soll.<br />
Es muss nicht unbedingt eine globale Variable quit sein (sollte es auch nicht), du könntest es z.B. auch so machen:</p>
<pre><code class="language-cpp">struct ThreadData
{
    SOCKET sock;
    bool*  quit;
};

int MeineThreadFunc( void* ptr )
{
    ThreadData* pData = static_cast&lt;ThreadData*&gt;(ptr);

    while ( ! (*pData-&gt;quit) )
    {
        //...
    }
}

// Thread starten
ThreadData data;
data.sock = my_socket;
data.quit = false;
ThreadStarten( thread_param = &amp;data ); // Pseudo-Code.. :)

// bla bla

// Thread soll sich beenden
thread_quit = true;
WaitForSingleObject( hThreadHandle, INFINITE );
</code></pre>
<p>Irgendwie so halt, gibt da viele Möglichkeiten..</p>
<p>WSAStartup &amp; Cleanup:<br />
So wie ich das kenne, ruft man, wenn man die socket-Funktionalitäten braucht, am Anfang des Programms WSAStartup auf und ganz am Ende des Programms WSACleanup. Das Namespace-Dings was ich da gezeigt hab deklariert eine globale Variable von der Klasse. Die wird vor dem Eintritt in die main-Funktion erstellt, also wird da der Konstruktor aufgerufen und WSAStartup ausgeführt. Bei Programmende wird diese globale Variable wieder destruiert und damit wird WSACleanup aufgerufen. Alternativ kannst du eine Instanz dieser Klasse in der main-Funktion deklarieren oder einfach manuell am Anfang WSAStartup und am Ende WSACleanup aufrufen.<br />
Der anonyme Namespace dient dazu, dass man weder die globale Variable noch die Klasse ansprechen oder benutzen kann. Hat den Vorteil, dass es quasi eine &quot;unsichtbare&quot; globale Variable ist, der Benutzer muss ja auch nix davon wissen, außer dass automatisch WSAStartup und Cleanup aufgerufen wird.</p>
<p>Thomas_ schrieb:</p>
<blockquote>
<p>Nochmal die Frage: Dadurch, dass ich mit einem Thread arbeite entstehen keine Komplikationen innerhalb der Funktion recvThread? Oder doch? ... ich habe mal gelesen, dass es Probleme gibt, wenn 2 Threads auf den gleichen Speicher zugreifen/ihn verändern/löschen ... und das recv nicht critical selection fähig ist ...</p>
</blockquote>
<p>Weiß ich ehrlich gesagt nicht genau. Von <em>deinem</em> Code jetzt müsste alles multithread-fähig sein, wie es _in_ der recv-Methode aussieht weiß ich jetzt aber nicht.<br />
Das Sauberste wäre meiner Meinung nach, einen eigenen Socket zum empfangen zu erstellen, der natürlich auf dem selben Port lauscht. Also einen Socket zum Senden (den du ja in main benutzt) und einen zum Empfangen, so können die sich nicht in die Quere kommen. Dass man nur mit einem Socket arbeitet der sendet _und_ empfängt, hab ich so noch nie gesehen, vielleicht weiß Scorcher was dazu <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1434334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434334</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 10 Jan 2008 14:47:47 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 14:50:26 GMT]]></title><description><![CDATA[<p>Der Test auf WSAEWOULDBLOCK ist doch quatsch, er setzt den Socket doch nirgendwo in den Non-Blocking Modus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434340</guid><dc:creator><![CDATA[o.O]]></dc:creator><pubDate>Thu, 10 Jan 2008 14:50:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 14:54:14 GMT]]></title><description><![CDATA[<p>o.O schrieb:</p>
<blockquote>
<p>Der Test auf WSAEWOULDBLOCK ist doch quatsch, er setzt den Socket doch nirgendwo in den Non-Blocking Modus.</p>
</blockquote>
<p>Das stimmt, allerdings schadet er auch nicht - sollte er mal non-blocking arbeiten, würde er sonst vergessen, das einzubauen. Und da die Überprüfung von WSAGetLastError sowieso nur zustande kommt, wenn es einen Fehler gibt, gibt es auch keinen Verlust bei der Laufzeit. Ich jedenfalls finde den Einbezug von WSAEWOULDBLOCK wesentlich flexibler und irgendwie &quot;allgemeiner&quot;. Ist im Endeffekt sowieso _seine_ Entscheidung und ich glaub ich schrieb auch schon, dass es im Fall der blockierenden Sockets nichts bringt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434348</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 10 Jan 2008 14:54:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Thu, 10 Jan 2008 15:07:13 GMT]]></title><description><![CDATA[<p>Aber so wie du die WSAEWOULDBLOCK Situation behandelst wäre es ja eh &quot;falsch&quot;. Es würde ja direkt wieder recv aufgerufen werden. Wenn man mit Non-Blocking Sockets arbeitet ruft man ja normalerweise recv erst wieder auf wenn select sagt das Daten da sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434364</guid><dc:creator><![CDATA[o.O]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:07:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Fri, 11 Jan 2008 11:50:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>o.O schrieb:</p>
<blockquote>
<p>Der Test auf WSAEWOULDBLOCK ist doch quatsch, er setzt den Socket doch nirgendwo in den Non-Blocking Modus.</p>
</blockquote>
<p>Das stimmt, allerdings schadet er auch nicht - sollte er mal non-blocking arbeiten, würde er sonst vergessen, das einzubauen. Und da die Überprüfung von WSAGetLastError sowieso nur zustande kommt, wenn es einen Fehler gibt, gibt es auch keinen Verlust bei der Laufzeit. Ich jedenfalls finde den Einbezug von WSAEWOULDBLOCK wesentlich flexibler und irgendwie &quot;allgemeiner&quot;. Ist im Endeffekt sowieso _seine_ Entscheidung und ich glaub ich schrieb auch schon, dass es im Fall der blockierenden Sockets nichts bringt.</p>
</blockquote>
<p>das ist natuerlich Ansichtssache, aber ich bin der Meinung, dass unnoetiger<br />
Code nichts in den Sourcen zu tun hat.</p>
<p>gruss<br />
v R</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434806</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434806</guid><dc:creator><![CDATA[virtuell Realisticer]]></dc:creator><pubDate>Fri, 11 Jan 2008 11:50:10 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Fri, 11 Jan 2008 12:01:52 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-1819.html" rel="nofollow">rüdiger</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-8.html" rel="nofollow">Rund um die Programmierung</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/1434816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434816</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Fri, 11 Jan 2008 12:01:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sat, 12 Jan 2008 14:41:51 GMT]]></title><description><![CDATA[<p>Ich hab jetzt nicht alles gelesen, doch wenn du nicht auf Threads oder dergleichen zurückgreifen möchtest, kannst du ja, Windowsprogrammierung vorrausgesetzt, WSAAsyncSelect verwenden.<br />
Dann kümmert sich Windows um die &quot;nichtblockerei&quot; und du bekommst immer eine Nachricht Geschickt wenn was passiert.</p>
<p>Jedoch müsstest du dich dann noch informieren wie Windows das genau macht.<br />
Ich selbst habe mal gelesen, dass Windows dafür selbstständig eigene Threads anlegt, jedoch habe ich woanders mal gehört, dass WSAAsyncSelect mit nonblocking Sockets arbeitet und das wolltest du ja nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435421</guid><dc:creator><![CDATA[Kahino]]></dc:creator><pubDate>Sat, 12 Jan 2008 14:41:51 GMT</pubDate></item></channel></rss>