<?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[Type-Length-Value Implementation]]></title><description><![CDATA[<p>Ich habe mir überlegt bei meiner client/server anwendung das TLV-Protokoll einzusetzen.<br />
Bei der Implementation hab ich allerdings noch keine mich überzeugende Idee.</p>
<p>Wie könnte man dies so einbauen, dass man die Nachrichten leicht parsen kann<br />
und die struktur um neue Nachrichten einfach erweiterbar ist?!<br />
Sollte ich enums verwenden oder lieber Konstanten?<br />
Könnten mir hier evtl. bestimmte Container von nutzen sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/189232/type-length-value-implementation</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 07:51:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/189232.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Aug 2007 07:22:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 07:22:57 GMT]]></title><description><![CDATA[<p>Ich habe mir überlegt bei meiner client/server anwendung das TLV-Protokoll einzusetzen.<br />
Bei der Implementation hab ich allerdings noch keine mich überzeugende Idee.</p>
<p>Wie könnte man dies so einbauen, dass man die Nachrichten leicht parsen kann<br />
und die struktur um neue Nachrichten einfach erweiterbar ist?!<br />
Sollte ich enums verwenden oder lieber Konstanten?<br />
Könnten mir hier evtl. bestimmte Container von nutzen sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1341980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1341980</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 10 Aug 2007 07:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 08:01:31 GMT]]></title><description><![CDATA[<p>hola</p>
<p>beispiel:<br />
nachrichten typ: 1 byte<br />
laenge: 2 byte<br />
nachricht x bytes:</p>
<p>du koenntest fuer jeden nachrichtentyp eine eigene klasse schreiben, welche jedoch alle von einer basisklasse ableiten. dann stopfst du alle z.b. in eine map.<br />
wenn eine nachricht am socket reinschwirrt, liest du das erste byte, holst dir, falls vorhanden, aus der map das richtige nachrichtenobjekt und uebergibst ihm eventuell den socket, oder liest den stream aus dem socket und uebergibst ihn dem objekt.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342001</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 10 Aug 2007 08:01:31 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 09:42:58 GMT]]></title><description><![CDATA[<p>vielleicht hilft das: <a href="https://www.opensc-project.org/openct/browser/trunk/src/ct/tlv.c" rel="nofollow">https://www.opensc-project.org/openct/browser/trunk/src/ct/tlv.c</a><br />
<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/1342071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342071</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Fri, 10 Aug 2007 09:42:58 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 12:53:12 GMT]]></title><description><![CDATA[<p>@Meep Meep</p>
<p>Danke, so in etwa hab ich mir das auch gedacht, aber hab trotzdem noch<br />
Schwierigkeiten bei der Umsetzung.<br />
Hat jemand lust ein minimal Beispiel zu geben?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16045">@Undertaker</a></p>
<p>Danke, aber der Code hilft mir leider nicht wirklich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342192</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 10 Aug 2007 12:53:12 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 13:33:55 GMT]]></title><description><![CDATA[<p>re</p>
<p>hier ein beispiel. nachdem ich bis jetzt noch nie std::map wirklich gebraucht habe, stimmt der syntax mit ziemlicher sicherheit ueberhaupt nicht. soll aber nur eine grobe veranschaulichung sein, wie das ablaufen koennte.</p>
<pre><code class="language-cpp">class BaseMsg
{
   public:
      BaseMsg(char t_msg) : msg(t_msg) { }
      virtual ~BaseMsg(void) { }

      char getMsgID(void) const { return msg; }

   protected:
      char msg;
};

class TextMsg : public BaseMsg
{
   public:
      TextMsg(char t_msg) : BaseMsg(t_msg), bytes_read(0) { }
      ~TextMsg(void) { }
      void Execute(SOCKET sock, std::ostream &amp;out)
      {
         short len;
         read_from_socket(sock, &amp;len, sizeof(len));
         char *buffer = new char[len];
         read_from_socket(sock, buffer, len);
         bytes_read += sizeof(len) + len;
         out &lt;&lt; buffer;
         delete[] buffer;
      }

   private:
      int bytes_read;
};

void InitializeMessages(std::map&lt;char,BaseMsg*&gt; &amp;map)
{
   map.insert(std::pair&lt;char,BaseMsg*&gt;(new TextMsg('t'));
   .... /* und weitere falls vorhanden */
}

void ReadLoop(std::map&lt;char,BaseMsg*&gt; &amp;map)
{
   ...
   while(socket_is_open)
   {
      char c;
      ReadFromSocket(socket, c);
      BaseMsg *my_msg = map[c];
      my_msg-&gt;Execute(socket);
   }
}

int main(void)
{
   ...
   std::map&lt;char,BaseMsg*&gt; msg_map;
   InitializeMessages(msg_map);
   ...
   ReadLoop(msg_map); /* wie auch immer */
}
</code></pre>
<p>du koenntest natuerlich auch deine abgeleiteten msg-klassen in dlls, falls du unter windows programmierst, auslagern und sie beim starten dynamisch einbinden.<br />
hat den vorteil das du dann die software selbst nicht immer wieder neu kompilieren musst, wenn ne neue msg-klasse dazukommt.</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342220</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 10 Aug 2007 13:33:55 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 15:46:53 GMT]]></title><description><![CDATA[<p>Also Meep Meep, der Code ist ja wohl grauselig wie nur was.<br />
Du solltest etwas nicht &quot;Message&quot; nennen wenn es ein &quot;Message Processor&quot; oder sowas in der Art ist. Pfui.<br />
Weiters wirst du in eine Map nicht einfach eine Value einfügen können, es sollte logisch sein dass du immer Key + Value brauchst.</p>
<p>Und: der Sinn hinter TLV ist ja dass man die Message gleich als ganzes lesen kann, das muss nicht in jeder Funktion die Messages bearbeitet neu stehen.</p>
<p>Sinnvollerweise liest man erstmal 2 Byte, und dann den Rest. Erst danach übergibt man den ganzen Krempel zur Verarbeitung. Dort erfolgt eben dann das Dispatching (welches du über eine Map realisiert hast, was keine schlechte Idee ist). Das macht den Code wesentlich einfacher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342299</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Aug 2007 15:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 17:13:51 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Also Meep Meep, der Code ist ja wohl grauselig wie nur was.<br />
Du solltest etwas nicht &quot;Message&quot; nennen wenn es ein &quot;Message Processor&quot; oder sowas in der Art ist. Pfui.<br />
Weiters wirst du in eine Map nicht einfach eine Value einfügen können, es sollte logisch sein dass du immer Key + Value brauchst.</p>
</blockquote>
<p>naja der code war schnell hingekritzelt, da ich mit meinem kater einen termin beim tierdiktor hatte.</p>
<p>fuer den insert wollte ich eigendlich</p>
<pre><code class="language-cpp">map.insert(std::pair&lt;char,BaseMsg*&gt;('t', new TextMsg('t'));
</code></pre>
<p>schreiben. waere das korrekt gewesen ?</p>
<p>Meep Meep</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342345</guid><dc:creator><![CDATA[Meep Meep]]></dc:creator><pubDate>Fri, 10 Aug 2007 17:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 17:27:28 GMT]]></title><description><![CDATA[<p>Was habt ihr eigentlich alle gegen make_pair? <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/1342350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342350</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 10 Aug 2007 17:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 18:39:19 GMT]]></title><description><![CDATA[<p>Meep Meep schrieb:</p>
<blockquote>
<p>fuer den insert wollte ich eigendlich</p>
<pre><code class="language-cpp">map.insert(std::pair&lt;char,BaseMsg*&gt;('t', new TextMsg('t'));
</code></pre>
<p>schreiben. waere das korrekt gewesen ?</p>
</blockquote>
<p>jupp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1342390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342390</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Aug 2007 18:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 19:03:16 GMT]]></title><description><![CDATA[<p>Airdamn schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16045">@Undertaker</a><br />
Danke, aber der Code hilft mir leider nicht wirklich.</p>
</blockquote>
<p>na schade, ist es doch fast eine complette TLV library.<br />
aber, ich kenne das, manchmal möchte man das rad eben nochmal erfinden. <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="😉"
    /><br />
--&gt; <a href="http://en.wikipedia.org/wiki/Not_Invented_Here" rel="nofollow">http://en.wikipedia.org/wiki/Not_Invented_Here</a><br />
(nicht böse gemeint)<br />
<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/1342398</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342398</guid><dc:creator><![CDATA[Undertaker]]></dc:creator><pubDate>Fri, 10 Aug 2007 19:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Type-Length-Value Implementation on Fri, 10 Aug 2007 19:25:40 GMT]]></title><description><![CDATA[<p>Undertaker schrieb:</p>
<blockquote>
<p>Airdamn schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/16045">@Undertaker</a><br />
Danke, aber der Code hilft mir leider nicht wirklich.</p>
</blockquote>
<p>na schade, ist es doch fast eine complette TLV library.<br />
aber, ich kenne das, manchmal möchte man das rad eben nochmal erfinden. <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="😉"
    /><br />
--&gt; <a href="http://en.wikipedia.org/wiki/Not_Invented_Here" rel="nofollow">http://en.wikipedia.org/wiki/Not_Invented_Here</a><br />
(nicht böse gemeint)<br />
<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>
</blockquote>
<p>Das Problem hier ist nicht das ausereinander nehmen von bytes.<br />
Es ging mir viel mehr darum, dass ich eine Geschickte Verarbeitung der<br />
eingehenden Nachrichten erreichen möchte.<br />
z.B. durch eine Message Factory oder durch eine map mit funktionspointern<br />
für die einzelnen Nachrichten-Typen. So das ich keine if-orgien oder elendig<br />
lange switches benötige <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>Zudem ist es auch finsteres C (string.h, stdio.h) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
nicht böse gemeint <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/1342408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1342408</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Fri, 10 Aug 2007 19:25:40 GMT</pubDate></item></channel></rss>