<?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[Windows downloader läd nicht viel]]></title><description><![CDATA[<p>Hallo,<br />
ich habe basierend auf einem Tutorial einen kleinen downloader geschrieben, welcher cURL aus dem Netz downloaden soll. Das Programm scheint die ganze Datei herunter zu laden, allerdings wird diese nicht wie geplant gespeichert. Folgend der Code. Ich würde mich freuen, wenn jemand von euch Zeit findet, sich das Programm mal anzuschauen und evlt neben dem eigentlichen Problem auch Design-technische tipps zu geben:</p>
<pre><code class="language-cpp">/*
Programm to download cURL and istall it on a windows machine
*/

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;errno.h&gt;
#include &lt;string&gt;
#include &lt;stdio.h&gt;

#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;
#include &lt;io.h&gt;

const int HTTP_PORT = 80;
const char SERVER[] = &quot;www.mirrorspace.org&quot;;
const char FILENAME[]   = &quot;/curl/curl-7.15.3-win32-ssl-sspi.zip&quot;;
const char SAVE[]   = &quot;C:\\Temp\\curl.zip&quot;;

int main(int argc, char **argv)
{
    struct hostent *hostinfo;
    char command[1024];
    char buf[1024];

    //create winsock
    WSADATA wsaData;
    if(WSAStartup (MAKEWORD(1, 1), &amp;wsaData) != 0) {
                  fprintf (stderr, &quot;WSAStartup(): can not initalize winsock.\n&quot;);
                  exit (EXIT_FAILURE);
    }

    /* create socket */
    int sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
       perror (&quot;socket()&quot;);
       exit (EXIT_FAILURE);
    }

    /* commit server address */
    struct sockaddr_in host_addr;
    memset( &amp;host_addr, 0, sizeof (host_addr));
    host_addr.sin_family = AF_INET;
    host_addr.sin_port = htons (HTTP_PORT);
    host_addr.sin_addr.s_addr = inet_addr (SERVER);
    if (host_addr.sin_addr.s_addr == INADDR_NONE) {
       /* Server was not given by IP but by name */
       hostinfo = gethostbyname (SERVER);
       if (hostinfo == NULL) {
          perror (&quot;gethostbyname()&quot;);
          exit (EXIT_FAILURE);
       }
       memcpy((char*) &amp;host_addr.sin_addr.s_addr, hostinfo-&gt;h_addr, hostinfo-&gt;h_length);
    }

    /* create connection */
    if (connect(sock, (struct sockaddr *) &amp;host_addr, sizeof(struct sockaddr)) == -1) {
       perror (&quot;connect()&quot;);
       exit (EXIT_FAILURE);
    }

    /* create HTTP-GET-command */
    sprintf (command, &quot;GET %s HTTP/1.0\nHost: %s\n\n&quot;, FILENAME, SERVER);

    printf(&quot;starting download\n&quot;);

    /* send command */
    unsigned int bytes_sent;
    bytes_sent = send (sock, command, strlen (command), 0);
    if (bytes_sent == -1) {
        perror (&quot;send()&quot;);
        exit (EXIT_FAILURE);
    }

    // receive answer of the server */
    unsigned int bytes_recv;
    while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) &gt; 0) {
         {
                       std::ofstream file(SAVE);
                       file&lt;&lt;bytes_recv;
         }
    }
    if (bytes_recv == -1) {
       perror (&quot;recv()&quot;);
       exit (EXIT_FAILURE);
    }

    printf (&quot;\n&quot;);

    closesocket(sock);
    WSACleanup();

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/145743/windows-downloader-läd-nicht-viel</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 09:58:30 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/145743.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Apr 2006 19:12:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Sun, 30 Apr 2006 19:12:01 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe basierend auf einem Tutorial einen kleinen downloader geschrieben, welcher cURL aus dem Netz downloaden soll. Das Programm scheint die ganze Datei herunter zu laden, allerdings wird diese nicht wie geplant gespeichert. Folgend der Code. Ich würde mich freuen, wenn jemand von euch Zeit findet, sich das Programm mal anzuschauen und evlt neben dem eigentlichen Problem auch Design-technische tipps zu geben:</p>
<pre><code class="language-cpp">/*
Programm to download cURL and istall it on a windows machine
*/

#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;errno.h&gt;
#include &lt;string&gt;
#include &lt;stdio.h&gt;

#include &lt;windows.h&gt;
#include &lt;winsock2.h&gt;
#include &lt;io.h&gt;

const int HTTP_PORT = 80;
const char SERVER[] = &quot;www.mirrorspace.org&quot;;
const char FILENAME[]   = &quot;/curl/curl-7.15.3-win32-ssl-sspi.zip&quot;;
const char SAVE[]   = &quot;C:\\Temp\\curl.zip&quot;;

int main(int argc, char **argv)
{
    struct hostent *hostinfo;
    char command[1024];
    char buf[1024];

    //create winsock
    WSADATA wsaData;
    if(WSAStartup (MAKEWORD(1, 1), &amp;wsaData) != 0) {
                  fprintf (stderr, &quot;WSAStartup(): can not initalize winsock.\n&quot;);
                  exit (EXIT_FAILURE);
    }

    /* create socket */
    int sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
       perror (&quot;socket()&quot;);
       exit (EXIT_FAILURE);
    }

    /* commit server address */
    struct sockaddr_in host_addr;
    memset( &amp;host_addr, 0, sizeof (host_addr));
    host_addr.sin_family = AF_INET;
    host_addr.sin_port = htons (HTTP_PORT);
    host_addr.sin_addr.s_addr = inet_addr (SERVER);
    if (host_addr.sin_addr.s_addr == INADDR_NONE) {
       /* Server was not given by IP but by name */
       hostinfo = gethostbyname (SERVER);
       if (hostinfo == NULL) {
          perror (&quot;gethostbyname()&quot;);
          exit (EXIT_FAILURE);
       }
       memcpy((char*) &amp;host_addr.sin_addr.s_addr, hostinfo-&gt;h_addr, hostinfo-&gt;h_length);
    }

    /* create connection */
    if (connect(sock, (struct sockaddr *) &amp;host_addr, sizeof(struct sockaddr)) == -1) {
       perror (&quot;connect()&quot;);
       exit (EXIT_FAILURE);
    }

    /* create HTTP-GET-command */
    sprintf (command, &quot;GET %s HTTP/1.0\nHost: %s\n\n&quot;, FILENAME, SERVER);

    printf(&quot;starting download\n&quot;);

    /* send command */
    unsigned int bytes_sent;
    bytes_sent = send (sock, command, strlen (command), 0);
    if (bytes_sent == -1) {
        perror (&quot;send()&quot;);
        exit (EXIT_FAILURE);
    }

    // receive answer of the server */
    unsigned int bytes_recv;
    while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) &gt; 0) {
         {
                       std::ofstream file(SAVE);
                       file&lt;&lt;bytes_recv;
         }
    }
    if (bytes_recv == -1) {
       perror (&quot;recv()&quot;);
       exit (EXIT_FAILURE);
    }

    printf (&quot;\n&quot;);

    closesocket(sock);
    WSACleanup();

    system(&quot;PAUSE&quot;);
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1048575</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1048575</guid><dc:creator><![CDATA[MaxDemian]]></dc:creator><pubDate>Sun, 30 Apr 2006 19:12:01 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Sun, 30 Apr 2006 19:56:28 GMT]]></title><description><![CDATA[<p>Entscheide dich mal ob du C oder C++ benutzen willst <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>Deine while Schleife ist falsch. Du schreibst doch überhaupt nicht die empfangenen Daten in die Datei. Ausserdem schickt der HTTP Server ja erst noch einen HTTP Header zurück, den du erst noch parsen musst, bevor die eigentlichen Daten kommen.</p>
<p>Wenn du für Windows programmierst, kannst du auch gleich die WinInet Funktionen benutzen, dann ersparst du dir diese Arbeit: <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/wininet_reference.asp" rel="nofollow">http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wininet/wininet/wininet_reference.asp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1048594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1048594</guid><dc:creator><![CDATA[WebNubbi]]></dc:creator><pubDate>Sun, 30 Apr 2006 19:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Tue, 02 May 2006 09:55:38 GMT]]></title><description><![CDATA[<p>Ich möchte den code ja gerade portabel halten, da ich evtl später so ein ähnliches Programm für linux schreiben möchte. Ich habe den code jetzt ein bisschen verändert, sodass er in die datei schreibt und den anfang parst. Das in die datei schreiben hat super geklappt, aber der Parser will einfach nicht. Das Programm startet aber es wird nichts mehr in die datei geschrieben. Anbei der veränderte code. Ich hoffe jemand sieht den Fehler darin:</p>
<pre><code class="language-cpp">// receive answer of the server */
    unsigned int bytes_recv;
    std::ofstream file(SAVE);
    char headerEnd[] = &quot;Content-Type: application/zip\n&quot;;
    char *pHE = headerEnd;
    int c = 0;
    bool HeaderReceived = false;
    while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) &gt; 0) {
         {
         if(HeaderReceived) {
                       file&lt;&lt;buf;
         } else {
                       //parse for response header
                       char *bufPointer = buf;
                       while(true) {
                       if(*bufPointer == *pHE) {
                                      pHE++;
                                      bufPointer++;
                                      c++;
                                      if(c == sizeof(headerEnd)) {
                                           HeaderReceived = true;
                                           break;
                                      }
                       } else { 
                         pHE = headerEnd;
                         c = 0;
                       }
                       }
                       }
         }
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1049411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1049411</guid><dc:creator><![CDATA[MaxDemian]]></dc:creator><pubDate>Tue, 02 May 2006 09:55:38 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Tue, 02 May 2006 10:01:13 GMT]]></title><description><![CDATA[<p>ich würde die antwort in zeilen unterteilen. wenn eine leere zeile kommt ist der header vollständig und ab da schreibst du in die datei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1049421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1049421</guid><dc:creator><![CDATA[re]]></dc:creator><pubDate>Tue, 02 May 2006 10:01:13 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Tue, 02 May 2006 10:56:53 GMT]]></title><description><![CDATA[<p>Übrigens würde ich zum Schreiben lieber fstream::write() verwenden als op&lt;&lt; (op&lt;&lt; erwartet einen nullterminierten C-String als Eingabe - und das trifft ziemlich sicher nicht auf deinen Zwischenpuffer zu).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1049451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1049451</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 02 May 2006 10:56:53 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Wed, 03 May 2006 16:15:47 GMT]]></title><description><![CDATA[<p>ok, ich hab das mal versucht umzusetzten, aber nach wie vor legt er die datei an aber schreibt nix hinein. Ich hoffe mal, du weist was ich falsch gemacht habe:</p>
<pre><code class="language-cpp">bool HeaderReceived = false;
    std::fstream fStream;
    fStream.open(SAVE,std::fstream::binary);
    char *bufPointer = buf;
    while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) &gt; 0)
    {
         if(HeaderReceived) {
                       fStream.write(buf,sizeof(buf));
         } else {
                       //parse for response header (new line = end of header)
                       while(true) {
                       if(*bufPointer == '\n' &amp;&amp; 
                       *(bufPointer-1) == '\n') 
                       {
                                      HeaderReceived = true;
                                      fStream.write(bufPointer,sizeof(bufPointer));
                                      break;
                       } else 
                       { 
                              bufPointer++;
                       }
                       }
         }
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1050390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050390</guid><dc:creator><![CDATA[MaxDemian]]></dc:creator><pubDate>Wed, 03 May 2006 16:15:47 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Thu, 04 May 2006 08:40:26 GMT]]></title><description><![CDATA[<p>Versuch's mal, wenn du den Stream per &quot;fStream.open(SAVE,std::ios::out|std::ios::binary);&quot; öffnest (sprich: Du solltest ihm dazusagen, daß er den Stream zur <strong>Ausgabe</strong> öffnen soll).</p>
<p>PS: Und &quot;fStream.write(buf,<em>bytes_recv</em>);&quot; dürfte auch von Vorteil sein <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>PPS: &quot;sizeof(bufPointer)&quot; ist vermutlich auch zu klein, um die Größe des ersten Blocks (abzüglich Header) zu beschreiben - da brauchst du &quot;bytes_recv - (bufPointer-buf)&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1050694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1050694</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 04 May 2006 08:40:26 GMT</pubDate></item><item><title><![CDATA[Reply to Windows downloader läd nicht viel on Sun, 07 May 2006 14:17:38 GMT]]></title><description><![CDATA[<p>Hmm, das laden hat begonnen, aber die datei ließ sich nicht öffnen. Darum habe ich mir die eigentliche Datei per Browser heruntergelade und geschaut, um wieviel byte sie sich verändert. Jetzt habe ich:</p>
<pre><code class="language-cpp">fstream fStream;
    fStream.open(SAVE,ios::out | ios::binary);
    char *bufPointer = buf;
    while ((bytes_recv = recv (sock, buf, sizeof(buf), 0)) &gt; 0)
    {
         if(HeaderReceived) {
                       fStream.write(buf,bytes_recv);
         } else {
                       //parse for response header (new line = end of header)
                       while(true) {
                       if(*bufPointer == '\n' &amp;&amp; 
                       *(bufPointer-1) == '\n') 
                       {
                                      HeaderReceived = true;
                                      cout&lt;&lt;&quot;bytes_recv: &quot;&lt;&lt;bytes_recv&lt;&lt;&quot;\n - &quot;&lt;&lt;(bufPointer-buf)&lt;&lt;endl;
                                      fStream.write(bufPointer,bytes_recv - (bufPointer-buf) + 156);
                                      break;
                       } else 
                       { 
                              bufPointer++;
                       }
                       }
         }
    }
</code></pre>
<p>Hat jemand ne Ahnung, warum das 156 zuviel sind?</p>
<p>Und noch eine Andere Frage zum öffnen des FileStreams:<br />
Was ist der unterschied zwischen ios::out und fstream::out? Klar, anderer namespace aber wieso funktioniert ios::out überhaupt?</p>
<p>Danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1052688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1052688</guid><dc:creator><![CDATA[MaxDemian]]></dc:creator><pubDate>Sun, 07 May 2006 14:17:38 GMT</pubDate></item></channel></rss>