<?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[Protokoll Übertragung]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche ein simples Protokoll zu erstellen und in dem Format soll eine Datei über eine Socketverbindung übertragen werden:</p>
<p>CODE | SIZEOFDATA | DATA</p>
<p>CODE ist eine zweistellige Zahl, z.B. 16<br />
SIZEOFDATA ist eine Zahl mit einer maximalen Größe, z.B. 65535</p>
<p>Wie wähle ich nun am besten die Datentypen für diese Variablen und wie baue ich die Variablen zu einer zusammen, um sie dann zu übertragen?</p>
<p>Etwas Pseudocode wär sehr nett.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/167752/protokoll-übertragung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:37:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/167752.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 14 Dec 2006 16:00:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Protokoll Übertragung on Thu, 14 Dec 2006 16:00:23 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich versuche ein simples Protokoll zu erstellen und in dem Format soll eine Datei über eine Socketverbindung übertragen werden:</p>
<p>CODE | SIZEOFDATA | DATA</p>
<p>CODE ist eine zweistellige Zahl, z.B. 16<br />
SIZEOFDATA ist eine Zahl mit einer maximalen Größe, z.B. 65535</p>
<p>Wie wähle ich nun am besten die Datentypen für diese Variablen und wie baue ich die Variablen zu einer zusammen, um sie dann zu übertragen?</p>
<p>Etwas Pseudocode wär sehr nett.</p>
<p>Danke.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1191877</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1191877</guid><dc:creator><![CDATA[deetee]]></dc:creator><pubDate>Thu, 14 Dec 2006 16:00:23 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Fri, 15 Dec 2006 08:57:04 GMT]]></title><description><![CDATA[<p>Ich würde für CODE einen char (8 Bit Integer, viel kleinere Datentypen kennt C++ nicht), für SIZE einen unsigned short (16 Bit) und für DATA einen std::string verwenden (wobei, SIZE würde ich intern gar nicht speichern, sondern aus der Länge des Strings berechnen, wenn nötig).</p>
<p>Zum Schreiben auf den Socket kannst du CODE und SIZE zu einem 3-Byte-Block zusammenfassen (reinterpret_cast) und vor den String schreiben - anschließend schickst du die Daten durch die Leitung.</p>
<pre><code class="language-cpp">char head[4];
head[0]=CODE;
reinterpret_cast&lt;unsigned short*&gt;(head+1) = DATA.length();
head[3]=0;
send((head+DATA).c_str(),DATA.length()+3);
</code></pre>
<p>Beim Lesen holst du dir erst die beiden Header-Elemente und danach die Daten:</p>
<pre><code class="language-cpp">recv(&amp;CODE,1);
unsigned short SIZE;
recv(&amp;SIZE,2);
DATA.resize(SIZE);
recv(&amp;DATA[0],SIZE);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1192207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192207</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 15 Dec 2006 08:57:04 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Fri, 15 Dec 2006 12:42:06 GMT]]></title><description><![CDATA[<p>Ein paar Hinweise hätte ich dazu.</p>
<pre><code class="language-cpp">reinterpret_cast&lt;unsigned short*&gt;(head+1) = DATA.length();
</code></pre>
<p>führt bei manchen Plattformen (Sparc beispielsweise) höchstwahrscheinlich zu einen Fehler, da Sparc keine ungeraden Speicheradressen mit 16 Bit ansprechen kann. Besser ist, die 2 Bytes einzeln zu setzen und auf der anderen Seite auch wieder zusammensetzen. Wenn es über das Netzwerk geht, könnte ja sogar eine andere CPU mit einem anderen Endianess vorliegen, was zu vertauschten high- und low-Bytes führt. Also etwa so:</p>
<p>Auf Senderseite:</p>
<pre><code class="language-cpp">head[1] = (DATA.length() &gt;&gt; 8) &amp; 0xff; // high-byte
  head[2] = DATA.length() &amp; 0xff;  // low-byte
</code></pre>
<p>Auf Empfängerseite:</p>
<pre><code class="language-cpp">unsigned short size = (head[1] &lt;&lt; 8) | head[2];
</code></pre>
<p>Ausserdem würde ich sowohl das Versenden noch das Empfangen über einen Puffer machen. send und recv sind Systemaufrufe, die recht teuer sind. Ein Senden oder Empfangen eines einzelnen Bytes mit solch einem Systemaufruf ist ein Performancekiller.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192424</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 15 Dec 2006 12:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Fri, 15 Dec 2006 12:45:36 GMT]]></title><description><![CDATA[<p>tntnet schrieb:</p>
<blockquote>
<p>Ein paar Hinweise hätte ich dazu.<br />
[...]</p>
</blockquote>
<p>Ich hab' nie beauptet, daß es perfekt ist - das waren, wie deetee auch gebeten hat, lediglich einige Pseudocode-Fetzen <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1192428</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192428</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 15 Dec 2006 12:45:36 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Fri, 15 Dec 2006 14:18:17 GMT]]></title><description><![CDATA[<p>hi,</p>
<p>der ansatz ist denke ich auf jedenfall das was ich brauche.</p>
<p>Noch ne Frage zu Big und Little Endian. Brauche ich auf senderseite für meinen Fall nun htons/htonl und für den empfang ntohs/ntohl? Jedenfalls für CODE und SIZE oder?</p>
<p>ok, dann versuch ich mich mal daran. Vielen dank für eure Beteiligung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192497</guid><dc:creator><![CDATA[deetee]]></dc:creator><pubDate>Fri, 15 Dec 2006 14:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Fri, 15 Dec 2006 14:34:53 GMT]]></title><description><![CDATA[<p>hton... (host-to-network...) verwendest Du auf Senderseite und ntoh... (network-to-host... auf Empfängerseite. Oder Du machst es so, wie ich geschrieben habe mit Bitoperationen. Die sind von Endianess unabhängig.</p>
<p>Tntnet</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1192505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1192505</guid><dc:creator><![CDATA[tntnet]]></dc:creator><pubDate>Fri, 15 Dec 2006 14:34:53 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Mon, 18 Dec 2006 09:22:05 GMT]]></title><description><![CDATA[<p>ok, ich bekomms nicht hin. Ich glaube mit meinem Speicher buf stimmt was nicht, hab ich den richtig deklariert von der Speichergröße her?</p>
<pre><code class="language-cpp">try
	{
		if(f.is_open())
		{
			//char* buf = new char[SIZE_CODE2 + sizeof(long) + SIZE_BUF_FILE]; // block format
			char* data = new char[SIZE_BUF_FILE]; // pure file content
			char* buf = new char[3];
			char* ptr;
			long bufSize = 0;
			unsigned char code;
			unsigned short size;

			f.seekg(0); // file beginning position

			while(packages &gt; 0)
			{
				f.read(data, SIZE_BUF_FILE);

				bufSize += f.gcount(); // currently read signs

				size = f.gcount();

				if(f.eof())
				{// send last or maybe only package
					code 	= CODE_LASTBLOCK;
					ptr 	= (char *) &amp;code;
					buf[0] 	= ptr[0];
					ptr 	= (char *) &amp;size;
					buf[1] 	= ptr[0];
					ptr 	= data;
					buf[2] 	= ptr[0];
					//sprintf(buf, &quot;%d\n%ld\n%s&quot;, code, size, data);
cout &lt;&lt; &quot;LAST &quot; &lt;&lt; endl;
					//Wrapper::Send(dataSock, buf,SIZE_CODE2 + sizeof(long) + size+1 + 2, 0);
					Wrapper::Send(dataSock, buf, size+3, 0);
				}
				else if(bufSize == SIZE_BUF_FILE)
				{
					bufSize = 0; // reset bufSize
					code = CODE_MOREBLOCKS;

					ptr 	= (char *) &amp;code;
					buf[0] 	= ptr[0];
					ptr 	= (char *) &amp;size;
					buf[1] 	= ptr[0];
					ptr 	= data;
					buf[2] 	= ptr[0];
					//sprintf(buf, &quot;%d\n%ld\n%s&quot;, code, size, data);
cout &lt;&lt; &quot;MORE &quot; &lt;&lt; endl;
					//Wrapper::Send(dataSock, buf, SIZE_CODE2 + sizeof(long) + SIZE_BUF_FILE + 2, 0);
					Wrapper::Send(dataSock, buf, size+3, 0);
				}
				packages--;
			}
			//delete[] buf;
			//delete[] data;
	cout &lt;&lt; &quot;get nach while()&quot; &lt;&lt; endl;
			//f.close();
	cout &lt;&lt; &quot;get nach f.close()&quot; &lt;&lt; endl;
		}
	}
	catch(std::bad_alloc &amp; exc)
	{
		cerr &lt;&lt; exc.what() &lt;&lt; endl;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1193843</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193843</guid><dc:creator><![CDATA[deetee]]></dc:creator><pubDate>Mon, 18 Dec 2006 09:22:05 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Mon, 18 Dec 2006 09:35:55 GMT]]></title><description><![CDATA[<p>Zumindest für den Fall, daß du noch Daten übergeben willst, ist der Buffer zu klein. Außerdem kannst du auch Arrays verwenden, wenn die benötigte Größe zur Laufzeit feststeht:</p>
<pre><code class="language-cpp">unsigned char buf[3+SIZE_BUF_FILE];
unsigned char code,*data=buf+3;//die ersten drei Bytes des Puffers sind der Header
unsigned short size;

while(pacckages&gt;0)
{
  f.read(data,SIZE_BUF_FILE);
  size=f.gcount();
  code=(f.eof())?CODE_LASTBLOCK:CODE_MOREBLOCKS;

  buf[0]=code;
  buf[1]=size&gt;&gt;8;
  buf[2]=size&amp; 0xFF;

  Wrapper::Send(dataSock,size+3,0);
  --pacckages
}
</code></pre>
<p>PS: Und wenn Code fast identisch wiederholt wird, lohnt sich eine Umstrukturierung des Programms <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1193853</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1193853</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Mon, 18 Dec 2006 09:35:55 GMT</pubDate></item><item><title><![CDATA[Reply to Protokoll Übertragung on Wed, 20 Dec 2006 18:58:12 GMT]]></title><description><![CDATA[<p>ok, jetzt hab ichs. Stimmt, man kann da noch optimieren, werde ich dann auch mal machen.</p>
<pre><code class="language-cpp">try
	{
		if(f.is_open())
		{
			char* ptr; // tmp pointer
			unsigned char code;
			unsigned short size;
			char* buf = new char[sizeof(code)+sizeof(size)+SIZE_BUF_FILE];
			char* data = new char[SIZE_BUF_FILE]; // pure file content

			f.seekg(0); // file beginning position

			while(packages &gt; 0)
			{
				f.read(data, SIZE_BUF_FILE);

				size = f.gcount();

				if(f.eof())
				{// send last or maybe only package
					code 	= CODE_LASTBLOCK;
					ptr 	= (char *) &amp;code;
					buf[0] 	= ptr[0];
					ptr 	= (char *) &amp;size;
					buf[1] 	= ptr[0];

					for(int i = 0; i &lt; size; i++)
					{
						buf[2+i] = data[i]; // write data char by char into buf
					}
					Wrapper::Send(dataSock, buf, size+sizeof(char)*2, 0);
				}
				else if(size == SIZE_BUF_FILE)
				{
					code = CODE_MOREBLOCKS;

					ptr 	= (char *) &amp;code;
					buf[0] 	= ptr[0];
					ptr 	= (char *) &amp;size;
					buf[1] 	= ptr[0];

					for(int i = 0; i &lt; size; i++)
					{
						buf[2+i] = data[i]; // write data char by char into buf
					}
					Wrapper::Send(dataSock, buf, size+sizeof(char)*2, 0);
				}
				packages--;
			}
			delete[] buf;
			delete[] data;
			f.close();
		}
	}
	catch(std::bad_alloc &amp; exc)
	{
		cerr &lt;&lt; exc.what() &lt;&lt; endl;
	}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1195597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1195597</guid><dc:creator><![CDATA[deetee]]></dc:creator><pubDate>Wed, 20 Dec 2006 18:58:12 GMT</pubDate></item></channel></rss>