<?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[recv() mit Connection: keep-alive]]></title><description><![CDATA[<p>Guten Abend!</p>
<p>Im wesentlichen schreibe ich derzeit eine kleine HttpRequest-Klasse mit SSL/TLS-Unterstützung. Als SSL-Lib verwende ich hierbei <code>PolarSSL</code> (sehr empfehlenswert [habe auch schon OpenSSL getestet]), die als SSL-Variante der <code>recv()</code> -Funktion <code>int ssl_read(ssl_context *ssl, unsigned char *buf, int len)</code> bereit stellt. Die maximal unterstützte Buffer-Größe beträgt 2048 Bytes.</p>
<p>Ich sende einen HTTP-Request:</p>
<pre><code>&quot;GET /accounts/ServiceLogin HTTP/1.1\r\n&quot;
&quot;Host: www.google.com\r\n&quot;
&quot;Connection: keep-alive\r\n\r\n&quot;;
</code></pre>
<p>Mein Code zum Empfangen der Response:</p>
<pre><code class="language-cpp">int oxHttp::SSLRecvpacket(void) {
  // Assuming that the headers size is not 2048 bytes
  unsigned char intern_buf[2049] = {0};

  // Get the HTTP-header.
  int len = sizeof(intern_buf) - 1;
  int ret;
  recv_header_ = &quot;&quot;;
  do {
    ret = ssl_read(&amp;ssl_, intern_buf, len);
    intern_buf[ret] = 0;

    recv_header_ += reinterpret_cast&lt;char*&gt;(intern_buf);
  } while (ret == len);

  // Get the Content-Length.
  uint32_t content_len = 0;
  if (!GetContentLength(recv_header_.c_str(), content_len))
    return ret;

  // Read the data based on Content-Length;
  uint32_t tmp = 0;
  recv_content_ = &quot;&quot;;
  do {
    ret = ssl_read(&amp;ssl_, intern_buf, len);
    intern_buf[ret] = '\0';

    recv_content_ += reinterpret_cast&lt;char*&gt;(intern_buf);

    tmp += ret;
  } while (tmp &lt; content_len);
  return tmp;
}
</code></pre>
<p>Wenn nun die Größe des Headers genau 2048 bytes beträgt, so wird die while-loop ein weiteres mal angesteuert und ssl_read() wird direkt anfangen den Content auszulesen.<br />
Da die Größe des Headers unbekannt ist muss die Einlese-Prozedur ja in einer Schleife formuliert werden ( <code>ssl_read()</code> unterstützt schließlich nur 2048 bytes), da sonst die Gefahr besteht, dass Teile des Headers nicht eingelesen werden.<br />
Generell muss allerdings vermieden werden, dass <code>ssl_read()</code> aufgerufen wird, obwohl keine Daten mehr vorliegen, die noch empfangen werden müssten. Sollte dieser Fall eintreten, so wird <code>ssl_read()</code> aufgrund <code>Connection: keep-alive</code> (welches ich beibehalten möchte) keine Rückgabe mehr liefern, da es weiterhin auf Daten wartet.</p>
<p>Ich suche nun ein Verfahren, um den Header und den Content korrekt einzulesen und hierbei die oben genannte Situation zu umgehen.</p>
<p>MfG, 0x2A</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277951/recv-mit-connection-keep-alive</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 13:43:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277951.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 26 Nov 2010 21:05:40 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to recv() mit Connection: keep-alive on Fri, 26 Nov 2010 21:05:40 GMT]]></title><description><![CDATA[<p>Guten Abend!</p>
<p>Im wesentlichen schreibe ich derzeit eine kleine HttpRequest-Klasse mit SSL/TLS-Unterstützung. Als SSL-Lib verwende ich hierbei <code>PolarSSL</code> (sehr empfehlenswert [habe auch schon OpenSSL getestet]), die als SSL-Variante der <code>recv()</code> -Funktion <code>int ssl_read(ssl_context *ssl, unsigned char *buf, int len)</code> bereit stellt. Die maximal unterstützte Buffer-Größe beträgt 2048 Bytes.</p>
<p>Ich sende einen HTTP-Request:</p>
<pre><code>&quot;GET /accounts/ServiceLogin HTTP/1.1\r\n&quot;
&quot;Host: www.google.com\r\n&quot;
&quot;Connection: keep-alive\r\n\r\n&quot;;
</code></pre>
<p>Mein Code zum Empfangen der Response:</p>
<pre><code class="language-cpp">int oxHttp::SSLRecvpacket(void) {
  // Assuming that the headers size is not 2048 bytes
  unsigned char intern_buf[2049] = {0};

  // Get the HTTP-header.
  int len = sizeof(intern_buf) - 1;
  int ret;
  recv_header_ = &quot;&quot;;
  do {
    ret = ssl_read(&amp;ssl_, intern_buf, len);
    intern_buf[ret] = 0;

    recv_header_ += reinterpret_cast&lt;char*&gt;(intern_buf);
  } while (ret == len);

  // Get the Content-Length.
  uint32_t content_len = 0;
  if (!GetContentLength(recv_header_.c_str(), content_len))
    return ret;

  // Read the data based on Content-Length;
  uint32_t tmp = 0;
  recv_content_ = &quot;&quot;;
  do {
    ret = ssl_read(&amp;ssl_, intern_buf, len);
    intern_buf[ret] = '\0';

    recv_content_ += reinterpret_cast&lt;char*&gt;(intern_buf);

    tmp += ret;
  } while (tmp &lt; content_len);
  return tmp;
}
</code></pre>
<p>Wenn nun die Größe des Headers genau 2048 bytes beträgt, so wird die while-loop ein weiteres mal angesteuert und ssl_read() wird direkt anfangen den Content auszulesen.<br />
Da die Größe des Headers unbekannt ist muss die Einlese-Prozedur ja in einer Schleife formuliert werden ( <code>ssl_read()</code> unterstützt schließlich nur 2048 bytes), da sonst die Gefahr besteht, dass Teile des Headers nicht eingelesen werden.<br />
Generell muss allerdings vermieden werden, dass <code>ssl_read()</code> aufgerufen wird, obwohl keine Daten mehr vorliegen, die noch empfangen werden müssten. Sollte dieser Fall eintreten, so wird <code>ssl_read()</code> aufgrund <code>Connection: keep-alive</code> (welches ich beibehalten möchte) keine Rückgabe mehr liefern, da es weiterhin auf Daten wartet.</p>
<p>Ich suche nun ein Verfahren, um den Header und den Content korrekt einzulesen und hierbei die oben genannte Situation zu umgehen.</p>
<p>MfG, 0x2A</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1986471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986471</guid><dc:creator><![CDATA[0x2A_]]></dc:creator><pubDate>Fri, 26 Nov 2010 21:05:40 GMT</pubDate></item><item><title><![CDATA[Reply to recv() mit Connection: keep-alive on Tue, 30 Nov 2010 21:27:35 GMT]]></title><description><![CDATA[<p>Schade, dass scheinbar keiner eine Antwort für mich hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1988218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1988218</guid><dc:creator><![CDATA[0x2A_]]></dc:creator><pubDate>Tue, 30 Nov 2010 21:27:35 GMT</pubDate></item></channel></rss>