<?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[Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie?]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe mal einige Fragen zur Netzwerkprogrammierung.</p>
<p>1.) Wie groß dürfen die Daten eines &quot;Bytes&quot; sein? Ich weiß die Frage hört sich ziemlich doof an, aber da bin ich mir recht unsicher. Der Prototyp meiner SendBuf-Funktion sieht so aus: (von <a href="http://www.alhem.net/Sockets/" rel="nofollow">hier</a>)</p>
<pre><code class="language-cpp">void SendBuf(const char *buf,size_t len,int f = 0);
</code></pre>
<p>Heißt das nun, dass ich nur Integer senden kann, die größer als 0 und kleiner als 255 sind? (Es geht um TCP falls das wichtig ist)</p>
<p>2.) Wenn meine Annahme stimmt - wie erstelle ich daraus ein vernünftiges Protokoll?<br />
Meine erste Idee war ein paar Konstanten zu setzen (auf dem Client und auf dem Server gleich). Beispiel:</p>
<pre><code class="language-cpp">enum Flags_t
{
    FlagStartFlag = 1 &lt;&lt; 0,
    FlagRequestAuth = 1 &lt;&lt; 1,
    FlagRequestInfo = 1 &lt;&lt; 2,
    FlagSendAuth = 1 &lt;&lt; 3,
    FlagSendInfo = 1 &lt;&lt; 4
};
</code></pre>
<p>Dann sendet halt je nach dem der Client und/oder der Server die Flag und wartet auf eine Antwort die eine vorgegebene Struktur hat. Beispiel:</p>
<pre><code class="language-cpp">const char testBytes[] = { FlagStartFlag, FlagRequestAuth };
SendBuf(testBytes, sizeof(testBytes));
//...
void OnRawData(const char *pBuffer, size_t iLength)
{
    if (iLength &gt;= 2)
    {
        if (pBuffer[0] == FlagStartFlag)
        {
            switch (pBuffer[1])
            {
            case FlagRequestAuth:
                //Daten senden
                break;
            //...
            }
    }
}
</code></pre>
<p>3.) Ist meine Idee so richtig? Oder falsch? Oder nur nicht ganz optimal? Wie sieht da eigentlich aus mit Unverwechselbarkeit? Was ist, wenn zufällig eine Chatnachricht mit 01 anfängt? Dann würde FlagStartFlag und FlagRequestAuth ja auch &quot;matchen&quot;. Wie kann ich so etwas vermeiden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271679/netzwerk-eigenes-quot-protokoll-quot-erstellen-wie</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 07:51:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271679.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Aug 2010 09:18:17 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 09:18:17 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe mal einige Fragen zur Netzwerkprogrammierung.</p>
<p>1.) Wie groß dürfen die Daten eines &quot;Bytes&quot; sein? Ich weiß die Frage hört sich ziemlich doof an, aber da bin ich mir recht unsicher. Der Prototyp meiner SendBuf-Funktion sieht so aus: (von <a href="http://www.alhem.net/Sockets/" rel="nofollow">hier</a>)</p>
<pre><code class="language-cpp">void SendBuf(const char *buf,size_t len,int f = 0);
</code></pre>
<p>Heißt das nun, dass ich nur Integer senden kann, die größer als 0 und kleiner als 255 sind? (Es geht um TCP falls das wichtig ist)</p>
<p>2.) Wenn meine Annahme stimmt - wie erstelle ich daraus ein vernünftiges Protokoll?<br />
Meine erste Idee war ein paar Konstanten zu setzen (auf dem Client und auf dem Server gleich). Beispiel:</p>
<pre><code class="language-cpp">enum Flags_t
{
    FlagStartFlag = 1 &lt;&lt; 0,
    FlagRequestAuth = 1 &lt;&lt; 1,
    FlagRequestInfo = 1 &lt;&lt; 2,
    FlagSendAuth = 1 &lt;&lt; 3,
    FlagSendInfo = 1 &lt;&lt; 4
};
</code></pre>
<p>Dann sendet halt je nach dem der Client und/oder der Server die Flag und wartet auf eine Antwort die eine vorgegebene Struktur hat. Beispiel:</p>
<pre><code class="language-cpp">const char testBytes[] = { FlagStartFlag, FlagRequestAuth };
SendBuf(testBytes, sizeof(testBytes));
//...
void OnRawData(const char *pBuffer, size_t iLength)
{
    if (iLength &gt;= 2)
    {
        if (pBuffer[0] == FlagStartFlag)
        {
            switch (pBuffer[1])
            {
            case FlagRequestAuth:
                //Daten senden
                break;
            //...
            }
    }
}
</code></pre>
<p>3.) Ist meine Idee so richtig? Oder falsch? Oder nur nicht ganz optimal? Wie sieht da eigentlich aus mit Unverwechselbarkeit? Was ist, wenn zufällig eine Chatnachricht mit 01 anfängt? Dann würde FlagStartFlag und FlagRequestAuth ja auch &quot;matchen&quot;. Wie kann ich so etwas vermeiden?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935036</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935036</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 02 Aug 2010 09:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 09:45:30 GMT]]></title><description><![CDATA[<blockquote>
<p>Heißt das nun, dass ich nur Integer senden kann, die größer als 0 und kleiner als 255 sind? (Es geht um TCP falls das wichtig ist)</p>
</blockquote>
<p>Du kannst z.b.</p>
<p>char bytestream[100];<br />
int i = 5000;</p>
<p>snprintf(bytestream, 100, &quot;%d&quot;, i);<br />
send(bytestream);</p>
<p>verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935058</guid><dc:creator><![CDATA[feigling]]></dc:creator><pubDate>Mon, 02 Aug 2010 09:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 10:46:36 GMT]]></title><description><![CDATA[<p>&quot;const char *buf&quot; ist nur ein Platzhalter für den Beginn eines Feldes im Speicher, welches nichts mit dem Typ char zu tun hat. Die Länge des Feldes gibst du in deinem &quot;len&quot; Parameter in Byte an. Ein Integer hat beispielsweise auf der x86 Architektur (umgangssprachlich 32-bit Architektur) 4 Byte länge.<br />
Einen Integer könntest du also beispielsweise über</p>
<pre><code class="language-cpp">int i = 42;
SendBuf( (char*)&amp;i, sizeof(int) );
</code></pre>
<p>senden. (was der Parameter f soll weis ich nicht)<br />
Man könnte auch &quot;const void *buf&quot; schreiben, allerdings nimmt man vermute ich mal char damit deutlich ist dass &quot;len&quot; in Byte gemessen wird (sizeof(char) ist ja = 1).</p>
<blockquote>
<p>Was ist, wenn zufällig eine Chatnachricht mit 01 anfängt</p>
</blockquote>
<p>Als Beispiel könntest du immer das erste Byte deiner Nachricht dem Zweck der Nachricht zuordnen. Zum einfacheren Debuggen nimmst du am besten ASCII Zeichen, du könntest zum Beispiel 'N' einer normalen Nachricht zuordnen, oder mit 'F' signalisieren dass du Flags auswerten willst. Also eine normale Nachricht &quot;Hallo, wie gehts?&quot; würde dann intern zu &quot;AHallo, wie gehts?&quot; werden. Der auswertende (Server?) Part liest dann das erste Byte der Nachricht ein, und weiß wie er den Rest der Nachricht zu behandeln hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935084</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Mon, 02 Aug 2010 10:46:36 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 11:13:25 GMT]]></title><description><![CDATA[<p>Hi.<br />
Danke!<br />
Dazu habe ich mal eine Frage. Und zwar benutze ich eine Pack-Funktion damit das ganze portabel bleibt. Diese benötigt jedoch einen <code>unsigned char*</code> Buffer, die <code>SendBuf</code> -Funktion nimmt aber nur einen <code>char*</code> Buffer an. Heißt das, ich kann mit dem <code>len</code> -Parameter das ganze &quot;steuern&quot;?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">unsigned char myData[128] = { '\0' };
//packen
//size_t size = pack(...);
SendBuf((const char*)myData, sizeof(unsigned char) * size);
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935096</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 02 Aug 2010 11:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 11:28:55 GMT]]></title><description><![CDATA[<p>Warum als Puffer nicht ein std::string oder std::vector&lt;char&gt;?</p>
<pre><code class="language-cpp">#include &lt;sstream&gt;

//...

std::ostringstream dataStream(std::ios::binary); //binary ist wichtig!

dataStream.write(daten, sizeof(daten));   //was auch immer &quot;daten&quot; ist
dataStream.write(daten2, sizeof(daten2)); //was auch immer &quot;daten2&quot; ist

MeineNetzwerkKlasse.SendBuffer(dataStream.str()); // Die Länge des Puffers steckt
                                                  // im std::string, der durch
                                                  // str() erzeugt wird

//...
//Fertig, ich habe keine Sorgen wegen Speicher feigeben etc.. :-)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1935112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935112</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Mon, 02 Aug 2010 11:28:55 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 12:18:22 GMT]]></title><description><![CDATA[<p>theliquidwave schrieb:</p>
<blockquote>
<p>Hi.<br />
Danke!<br />
Dazu habe ich mal eine Frage. Und zwar benutze ich eine Pack-Funktion damit das ganze portabel bleibt. Diese benötigt jedoch einen <code>unsigned char*</code> Buffer, die <code>SendBuf</code> -Funktion nimmt aber nur einen <code>char*</code> Buffer an. Heißt das, ich kann mit dem <code>len</code> -Parameter das ganze &quot;steuern&quot;?</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">unsigned char myData[128] = { '\0' };
//packen
//size_t size = pack(...);
SendBuf((const char*)myData, sizeof(unsigned char) * size);
</code></pre>
<p>Gruß</p>
</blockquote>
<p>Was du deiner Sende-Funktion reingibst ist an sich egal, du kannst meinetwegen auch &quot;unsigned char*&quot; in &quot;char*&quot; casten das sollte nichts ändern. Wichtig ist nur wie du auf der Empfangsseite deine empfangenen Daten interpretierst, eben entweder als &quot;unsigned char&quot; oder als normaler &quot;char&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935136</guid><dc:creator><![CDATA[RedPuma]]></dc:creator><pubDate>Mon, 02 Aug 2010 12:18:22 GMT</pubDate></item><item><title><![CDATA[Reply to Netzwerk: Eigenes &amp;quot;Protokoll&amp;quot; erstellen - wie? on Mon, 02 Aug 2010 13:07:37 GMT]]></title><description><![CDATA[<p>Stimmt.<br />
Man, Netzwerkprogrammierung ist doch ein wenig umfangreicher als ich dachte.<br />
Bis jetzt funktioniert alles wie gewollt.</p>
<p>Danke an alle!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1935154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1935154</guid><dc:creator><![CDATA[theliquidwave]]></dc:creator><pubDate>Mon, 02 Aug 2010 13:07:37 GMT</pubDate></item></channel></rss>