<?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>Hallo zusammen ... ich beschäftige mich gerade mit UDP Socketprogrammierung...</p>
<p>Dabei habe ich mich an das Tutorial von <a href="http://c-worker.ch" rel="nofollow">c-worker.ch</a> gehalten.</p>
<p>In dem Tutorial kan man jedoch nur abwechselt 1x senden und 1x empfangen ...</p>
<p>Also habe ich mit Threads gearbeitet und das folgende Ergebnis hervorgebracht.<br />
Das Problem die Funktion recvfrom() liefert solange SOCKET_ERROR, bis ich zum ersten mal was sende ... von da an, blockiert die Funktion korrekt und empfängt alles richtig ...</p>
<p>Aber warum kommt solange ich nichts gesendet habe immer der Fehler?</p>
<p>Außerdem soll die Funktion recvfrom() NULL zurückliefern, wenn der Server die Verbindung trennt ...<br />
Leider funktioniert das auch nicht ... warum?</p>
<p>So und hier nun der Code:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;

#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;

SOCKET CreateSocket(char *ServerName, u_short Port, SOCKADDR_IN &amp;addr);
bool CloseSocket(SOCKET &amp;Socket);

#define DEBUG
//Client
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
bool inline PrintToLog(const char *Text)
{
 return (printf(Text) == EOF)? false : true;
};
//---------------------------------------------------------------------------
DWORD WINAPI recvThread(LPVOID Data)
{
   long rc;
   SOCKADDR remoteAddr;
   int remoteAddrLen = sizeof(SOCKADDR);

   char buf[256];
   do
   {
      rc = recvfrom((SOCKET)Data, buf, 255, 0, &amp;remoteAddr, &amp;remoteAddrLen);
      if (rc == 0) // Server hat die Verbindung getrennt
      {
         PrintToLog(&quot;Server hat die Verbindung getrennt...\n&quot;);
         break;
      }
      if (rc == SOCKET_ERROR) // Fehler beim Empfangen
      {

         PrintToLog(&quot;Fehler beim  ausfuehren der Funktion recvfrom()...\n&quot;);
         //break;
      }
      buf[rc]='\0';
      PrintToLog(buf);
   }
   while (rc != 0);

 return (DWORD)Data;
}
//Client
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
   char *ServerName = &quot;192.168.0.13&quot;;

   SOCKET Socket;
   SOCKADDR_IN addr;
   Socket = CreateSocket(ServerName, 12345, addr;

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

         char buf[256];
         do
         {
            gets(buf);
            if (strlen(buf) == 0);

            sendto(Socket, buf, strlen(buf), 0, (SOCKADDR*)&amp;addr, sizeof(SOCKADDR));

         } while (1);

         WaitForSingleObject(hThread, INFINITE);

         CloseSocket(Socket);
         CloseHandle(hThread);
   }
   getchar();
  return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
SOCKET CreateSocket(char *ServerName, u_short Port, SOCKADDR_IN &amp;addr)
{
   WSADATA wsa;
   SOCKET Socket;

   long rc = WSAStartup(MAKEWORD(2,0), &amp;wsa);
   if (rc != NULL)
   {
      return 0;
   }

   Socket = socket(AF_INET, SOCK_DGRAM, 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);
   addr.sin_addr.s_addr = inet_addr(ServerName);

 return Socket;
}
//---------------------------------------------------------------------------
bool CloseSocket(SOCKET &amp;Socket)
{
 return closesocket(Socket) &amp;&amp; WSACleanup();
}
//---------------------------------------------------------------------------
</code></pre>
<p>Vielen Dank für Hilfe!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/202565/frage-zu-tutorial-von-www-c-worker-ch-tcp-udp-socket-programmierung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 18:02:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202565.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 13 Jan 2008 01:01:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 01:01:54 GMT]]></title><description><![CDATA[<p>Hallo zusammen ... ich beschäftige mich gerade mit UDP Socketprogrammierung...</p>
<p>Dabei habe ich mich an das Tutorial von <a href="http://c-worker.ch" rel="nofollow">c-worker.ch</a> gehalten.</p>
<p>In dem Tutorial kan man jedoch nur abwechselt 1x senden und 1x empfangen ...</p>
<p>Also habe ich mit Threads gearbeitet und das folgende Ergebnis hervorgebracht.<br />
Das Problem die Funktion recvfrom() liefert solange SOCKET_ERROR, bis ich zum ersten mal was sende ... von da an, blockiert die Funktion korrekt und empfängt alles richtig ...</p>
<p>Aber warum kommt solange ich nichts gesendet habe immer der Fehler?</p>
<p>Außerdem soll die Funktion recvfrom() NULL zurückliefern, wenn der Server die Verbindung trennt ...<br />
Leider funktioniert das auch nicht ... warum?</p>
<p>So und hier nun der Code:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;

#include &lt;stdio.h&gt;
#include &lt;conio.h&gt;

SOCKET CreateSocket(char *ServerName, u_short Port, SOCKADDR_IN &amp;addr);
bool CloseSocket(SOCKET &amp;Socket);

#define DEBUG
//Client
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
bool inline PrintToLog(const char *Text)
{
 return (printf(Text) == EOF)? false : true;
};
//---------------------------------------------------------------------------
DWORD WINAPI recvThread(LPVOID Data)
{
   long rc;
   SOCKADDR remoteAddr;
   int remoteAddrLen = sizeof(SOCKADDR);

   char buf[256];
   do
   {
      rc = recvfrom((SOCKET)Data, buf, 255, 0, &amp;remoteAddr, &amp;remoteAddrLen);
      if (rc == 0) // Server hat die Verbindung getrennt
      {
         PrintToLog(&quot;Server hat die Verbindung getrennt...\n&quot;);
         break;
      }
      if (rc == SOCKET_ERROR) // Fehler beim Empfangen
      {

         PrintToLog(&quot;Fehler beim  ausfuehren der Funktion recvfrom()...\n&quot;);
         //break;
      }
      buf[rc]='\0';
      PrintToLog(buf);
   }
   while (rc != 0);

 return (DWORD)Data;
}
//Client
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
   char *ServerName = &quot;192.168.0.13&quot;;

   SOCKET Socket;
   SOCKADDR_IN addr;
   Socket = CreateSocket(ServerName, 12345, addr;

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

         char buf[256];
         do
         {
            gets(buf);
            if (strlen(buf) == 0);

            sendto(Socket, buf, strlen(buf), 0, (SOCKADDR*)&amp;addr, sizeof(SOCKADDR));

         } while (1);

         WaitForSingleObject(hThread, INFINITE);

         CloseSocket(Socket);
         CloseHandle(hThread);
   }
   getchar();
  return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
SOCKET CreateSocket(char *ServerName, u_short Port, SOCKADDR_IN &amp;addr)
{
   WSADATA wsa;
   SOCKET Socket;

   long rc = WSAStartup(MAKEWORD(2,0), &amp;wsa);
   if (rc != NULL)
   {
      return 0;
   }

   Socket = socket(AF_INET, SOCK_DGRAM, 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);
   addr.sin_addr.s_addr = inet_addr(ServerName);

 return Socket;
}
//---------------------------------------------------------------------------
bool CloseSocket(SOCKET &amp;Socket)
{
 return closesocket(Socket) &amp;&amp; WSACleanup();
}
//---------------------------------------------------------------------------
</code></pre>
<p>Vielen Dank für Hilfe!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435714</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435714</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Sun, 13 Jan 2008 01:01:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 11:07:53 GMT]]></title><description><![CDATA[<p>Hinweis für deine CreateSocket Funktion:<br />
Benütze INVALID_SOCKET (-1). Ein Socket Value kann durchaus 0 sein.<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms740516.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740516.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435796</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 13 Jan 2008 11:07:53 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 11:10:06 GMT]]></title><description><![CDATA[<p>Wenn Du ein SOCKET_ERROR bekommst würde ich mit WSAGetLastError() den genauen Fehler herausfinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435800</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 13 Jan 2008 11:10:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 11:16:02 GMT]]></title><description><![CDATA[<p>Generell ist es so, dass UDP ein verbindungsloses Protokoll ist.<br />
Das heisst es gibt kein Status &quot;Verbunden&quot;, &quot;Nicht Verbunden&quot; usw.</p>
<p>der Returnwert 0 von recvfrom hat nicht die gleiche Bedeutung bei einem Verbindungslosen Socket, bzw. bei einem Verbindungsorientierten Socket.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435805</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 13 Jan 2008 11:16:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 11:58:55 GMT]]></title><description><![CDATA[<p>@ simon.gysi:</p>
<blockquote>
<p>Hinweis für deine CreateSocket Funktion:<br />
Benütze INVALID_SOCKET (-1). Ein Socket Value kann durchaus 0 sein.<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms740516.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740516.aspx</a></p>
</blockquote>
<p>Ok! Guter Hinweis!</p>
<pre><code>Wenn Du ein SOCKET_ERROR bekommst würde ich mit WSAGetLastError() den genauen Fehler herausfinden.
</code></pre>
<p>Habe ich gemacht ... ich kann nur damit genauso wenig anfangen, als dass ich weiß, dass es sich um einen Fehler handelt. Ich bekomme den Fehlercode 10022.</p>
<pre><code>Generell ist es so, dass UDP ein verbindungsloses Protokoll ist. 
Das heisst es gibt kein Status &quot;Verbunden&quot;, &quot;Nicht Verbunden&quot; usw. 

der Returnwert 0 von recvfrom hat nicht die gleiche Bedeutung bei einem Verbindungslosen Socket, bzw. bei einem Verbindungsorientierten Socket.
</code></pre>
<p>Mag sein ... dennoch stand das in der Hilfe so drin (Return Values</p>
<p>If no error occurs, recvfrom returns the number of bytes received. <strong>If the connection has been gracefully closed, the return value is zero</strong>. Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.)</p>
<p>Aber warum tritt nun der von mir beschriebene Fehler auf?<br />
Das Problem die Funktion recvfrom() liefert solange SOCKET_ERROR, bis ich zum</p>
<pre><code>ersten mal was sende ... von da an, blockiert die Funktion korrekt und empfängt alles richtig ...
</code></pre>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435824</guid><dc:creator><![CDATA[Thomas_]]></dc:creator><pubDate>Sun, 13 Jan 2008 11:58:55 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 12:06:14 GMT]]></title><description><![CDATA[<p>10022: Ein ungültiges Argument wurde angegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435826</guid><dc:creator><![CDATA[.............]]></dc:creator><pubDate>Sun, 13 Jan 2008 12:06:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Tutorial von www.c-worker.ch (TCP&#x2F;UDP Socket Programmierung) on Sun, 13 Jan 2008 12:29:30 GMT]]></title><description><![CDATA[<p>Hier kannst Du übrigens die Socket Errors nachschlagen:<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms740668(VS.85).aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740668(VS.85).aspx</a></p>
<p>Hier ist die Doku zu recvfrom(..) auf MSDN:<br />
<a href="http://msdn2.microsoft.com/en-us/library/ms740120.aspx" rel="nofollow">http://msdn2.microsoft.com/en-us/library/ms740120.aspx</a></p>
<p>Da steht, dass wenn WSAEINVAL (10022) auftritt vermutlich das socket nicht geunden ist.</p>
<p>-&gt; Beim empfangen musst Du dem socket mitteilen auf welchem interface (ip addr) und auf welchem port Du Daten empfangen möchtest. Das geschieht mit der Funktion bind.</p>
<p>Q. Warum giengs dann nach dem 1. mal senden???<br />
A. Weil da das socket implizit gebunden wird.</p>
<p>Ich würde als Test mal den Sender und Empfänger Code trennen. Das hilft das ganze zu verstehen.</p>
<p>Ich korrigiere die anderen Fehler absichtlich nicht, da sie nichts mit deinem eigentlichen Problem zu tun haben (ev. sind sie auch nur hier im Forum Code...).</p>
<p>Grüsse<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1435838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1435838</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Sun, 13 Jan 2008 12:29:30 GMT</pubDate></item></channel></rss>