<?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[Integer Senden und Empfangen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Frage bezüglich UDP Programmierung mit C++:</p>
<p>Und zwar hielt ich mich bis jetzt an das Tutorial und den Example Code von <a href="http://www.gafferongames.com" rel="nofollow">www.gafferongames.com</a> und der funktionierte auch wunderbar.<br />
Doch jetzt würde ich gerne nicht mehr strings verschicken, sondern mehrere Integer.</p>
<p>Der Original Code lautet in etwa:</p>
<pre><code class="language-cpp">unsigned char packet[] = &quot;server to client&quot;;
connection.SendPacket( packet, sizeof( packet ) );
</code></pre>
<p>Die SendPacket Methode:</p>
<pre><code class="language-cpp">bool SendPacket( const unsigned char data[], int size )
		{
			assert( running );
			if ( address.GetAddress() == 0 )
				return false;
			unsigned char packet[size+4];
			packet[0] = (unsigned char) ( protocolId &gt;&gt; 24 );
			packet[1] = (unsigned char) ( ( protocolId &gt;&gt; 16 ) &amp; 0xFF );
			packet[2] = (unsigned char) ( ( protocolId &gt;&gt; 8 ) &amp; 0xFF );
			packet[3] = (unsigned char) ( ( protocolId ) &amp; 0xFF );
			memcpy( &amp;packet[4], data, size );
			return socket.Send( address, packet, size + 4 );
		}
</code></pre>
<p>und die Send Methode:</p>
<pre><code class="language-cpp">bool Send( const Address &amp; destination, const void * data, int size )
		{
			assert( data );
			assert( size &gt; 0 );

			if ( socket == 0 )
				return false;

			assert( destination.GetAddress() != 0 );
			assert( destination.GetPort() != 0 );

			sockaddr_in address;
			address.sin_family = AF_INET;
			address.sin_addr.s_addr = htonl( destination.GetAddress() );
			address.sin_port = htons( (unsigned short) destination.GetPort() );

			int sent_bytes = sendto( socket, (const char*)data, size, 0, (sockaddr*)&amp;address, sizeof(sockaddr_in) );

			return sent_bytes == size;
		}
</code></pre>
<p>Jetzt hab ich versucht einfach in den packet parameter von SendPacket() nen int array reinzuschieben. Das klappt auch zum teil.<br />
Und zwar, wenn ich mir das angekommene anschaue, finde ich den ersten integer von dem array wieder, aber der zweite fehlt komplett.</p>
<p>Das hier ist noch der receive code:</p>
<pre><code class="language-cpp">int Receive( Address &amp; sender, void * data, int size )
		{
			assert( data );
			assert( size &gt; 0 );

			if ( socket == 0 )
				return false;

			#if PLATFORM == PLATFORM_WINDOWS
			typedef int socklen_t;
			#endif

			sockaddr_in from;
			socklen_t fromLength = sizeof( from );

			int received_bytes = recvfrom( socket, (char*)data, size, 0, (sockaddr*)&amp;from, &amp;fromLength );

			if ( received_bytes &lt;= 0 )
				return 0;

			unsigned int address = ntohl( from.sin_addr.s_addr );
			unsigned short port = ntohs( from.sin_port );

			sender = Address( address, port );

			return received_bytes;
		}
</code></pre>
<pre><code class="language-cpp">int ReceivePacket( unsigned char data[], int size )
		{
			assert( running );
			unsigned char packet[size+4];
			Address sender;
			int bytes_read = socket.Receive( sender, packet, size + 4 );
			if ( bytes_read == 0 )
				return 0;
			if ( bytes_read &lt;= 4 )
				return 0;
			if ( packet[0] != (unsigned char) ( protocolId &gt;&gt; 24 ) || 
				 packet[1] != (unsigned char) ( ( protocolId &gt;&gt; 16 ) &amp; 0xFF ) ||
				 packet[2] != (unsigned char) ( ( protocolId &gt;&gt; 8 ) &amp; 0xFF ) ||
				 packet[3] != (unsigned char) ( protocolId &amp; 0xFF ) )
				return 0;
			if ( mode == Server &amp;&amp; !IsConnected() )
			{
				printf( &quot;server accepts connection from client %d.%d.%d.%d:%d\n&quot;, 
					sender.GetA(), sender.GetB(), sender.GetC(), sender.GetD(), sender.GetPort() );
				state = Connected;
				address = sender;
			}
			if ( sender == address )
			{
				if ( mode == Client &amp;&amp; state == Connecting )
				{
					printf( &quot;client completes connection with server\n&quot; );
					state = Connected;
				}
				timeoutAccumulator = 0.0f;
				memcpy( data, &amp;packet[4], size - 4 );
				return size - 4;
			}
			return 0;
		}
</code></pre>
<p>Also ich würde gerne Anstatt dem unsigned char array da ne vernünftige Anzahl Integer reinstecken und die dann nach dem Empfangen auch wieder auslesen <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="🙂"
    /><br />
Danke für jede Hilfe! Ich hab nirgendswo etwas darüber gefunden, wie es konkret geht. Der Code ist geschrieben von Glenn Fiedler und auf <a href="http://www.gafferongames.com" rel="nofollow">www.gafferongames.com</a> zu finden!</p>
<p>Dank und Gruß, peter</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282466/integer-senden-und-empfangen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 02:46:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282466.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Feb 2011 17:18:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Integer Senden und Empfangen on Sun, 20 Feb 2011 17:18:21 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine Frage bezüglich UDP Programmierung mit C++:</p>
<p>Und zwar hielt ich mich bis jetzt an das Tutorial und den Example Code von <a href="http://www.gafferongames.com" rel="nofollow">www.gafferongames.com</a> und der funktionierte auch wunderbar.<br />
Doch jetzt würde ich gerne nicht mehr strings verschicken, sondern mehrere Integer.</p>
<p>Der Original Code lautet in etwa:</p>
<pre><code class="language-cpp">unsigned char packet[] = &quot;server to client&quot;;
connection.SendPacket( packet, sizeof( packet ) );
</code></pre>
<p>Die SendPacket Methode:</p>
<pre><code class="language-cpp">bool SendPacket( const unsigned char data[], int size )
		{
			assert( running );
			if ( address.GetAddress() == 0 )
				return false;
			unsigned char packet[size+4];
			packet[0] = (unsigned char) ( protocolId &gt;&gt; 24 );
			packet[1] = (unsigned char) ( ( protocolId &gt;&gt; 16 ) &amp; 0xFF );
			packet[2] = (unsigned char) ( ( protocolId &gt;&gt; 8 ) &amp; 0xFF );
			packet[3] = (unsigned char) ( ( protocolId ) &amp; 0xFF );
			memcpy( &amp;packet[4], data, size );
			return socket.Send( address, packet, size + 4 );
		}
</code></pre>
<p>und die Send Methode:</p>
<pre><code class="language-cpp">bool Send( const Address &amp; destination, const void * data, int size )
		{
			assert( data );
			assert( size &gt; 0 );

			if ( socket == 0 )
				return false;

			assert( destination.GetAddress() != 0 );
			assert( destination.GetPort() != 0 );

			sockaddr_in address;
			address.sin_family = AF_INET;
			address.sin_addr.s_addr = htonl( destination.GetAddress() );
			address.sin_port = htons( (unsigned short) destination.GetPort() );

			int sent_bytes = sendto( socket, (const char*)data, size, 0, (sockaddr*)&amp;address, sizeof(sockaddr_in) );

			return sent_bytes == size;
		}
</code></pre>
<p>Jetzt hab ich versucht einfach in den packet parameter von SendPacket() nen int array reinzuschieben. Das klappt auch zum teil.<br />
Und zwar, wenn ich mir das angekommene anschaue, finde ich den ersten integer von dem array wieder, aber der zweite fehlt komplett.</p>
<p>Das hier ist noch der receive code:</p>
<pre><code class="language-cpp">int Receive( Address &amp; sender, void * data, int size )
		{
			assert( data );
			assert( size &gt; 0 );

			if ( socket == 0 )
				return false;

			#if PLATFORM == PLATFORM_WINDOWS
			typedef int socklen_t;
			#endif

			sockaddr_in from;
			socklen_t fromLength = sizeof( from );

			int received_bytes = recvfrom( socket, (char*)data, size, 0, (sockaddr*)&amp;from, &amp;fromLength );

			if ( received_bytes &lt;= 0 )
				return 0;

			unsigned int address = ntohl( from.sin_addr.s_addr );
			unsigned short port = ntohs( from.sin_port );

			sender = Address( address, port );

			return received_bytes;
		}
</code></pre>
<pre><code class="language-cpp">int ReceivePacket( unsigned char data[], int size )
		{
			assert( running );
			unsigned char packet[size+4];
			Address sender;
			int bytes_read = socket.Receive( sender, packet, size + 4 );
			if ( bytes_read == 0 )
				return 0;
			if ( bytes_read &lt;= 4 )
				return 0;
			if ( packet[0] != (unsigned char) ( protocolId &gt;&gt; 24 ) || 
				 packet[1] != (unsigned char) ( ( protocolId &gt;&gt; 16 ) &amp; 0xFF ) ||
				 packet[2] != (unsigned char) ( ( protocolId &gt;&gt; 8 ) &amp; 0xFF ) ||
				 packet[3] != (unsigned char) ( protocolId &amp; 0xFF ) )
				return 0;
			if ( mode == Server &amp;&amp; !IsConnected() )
			{
				printf( &quot;server accepts connection from client %d.%d.%d.%d:%d\n&quot;, 
					sender.GetA(), sender.GetB(), sender.GetC(), sender.GetD(), sender.GetPort() );
				state = Connected;
				address = sender;
			}
			if ( sender == address )
			{
				if ( mode == Client &amp;&amp; state == Connecting )
				{
					printf( &quot;client completes connection with server\n&quot; );
					state = Connected;
				}
				timeoutAccumulator = 0.0f;
				memcpy( data, &amp;packet[4], size - 4 );
				return size - 4;
			}
			return 0;
		}
</code></pre>
<p>Also ich würde gerne Anstatt dem unsigned char array da ne vernünftige Anzahl Integer reinstecken und die dann nach dem Empfangen auch wieder auslesen <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="🙂"
    /><br />
Danke für jede Hilfe! Ich hab nirgendswo etwas darüber gefunden, wie es konkret geht. Der Code ist geschrieben von Glenn Fiedler und auf <a href="http://www.gafferongames.com" rel="nofollow">www.gafferongames.com</a> zu finden!</p>
<p>Dank und Gruß, peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2023813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2023813</guid><dc:creator><![CDATA[Peter.peter]]></dc:creator><pubDate>Sun, 20 Feb 2011 17:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Integer Senden und Empfangen on Mon, 21 Feb 2011 13:45:37 GMT]]></title><description><![CDATA[<p>Kann es sein, das du die size-Angaben fuer SendPacket / ReceivePacket in 'Anzahl Integer' angegeben hast? Die Muessen in size (= Anzahl * sizeof(int)) gesendet werden - wobei sizeof(packet) auch gehen sollte wenn packet ein statischer integer array ist.</p>
<p>Ansonsten lohnt es sich auch mal mit Wireshark zu schauen was bei dir so uebers netzwerk geht, dann weisst du ob es auf Sende- oder Empfangs-Seite haengt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024154</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024154</guid><dc:creator><![CDATA[Zulan]]></dc:creator><pubDate>Mon, 21 Feb 2011 13:45:37 GMT</pubDate></item><item><title><![CDATA[Reply to Integer Senden und Empfangen on Mon, 21 Feb 2011 13:58:11 GMT]]></title><description><![CDATA[<p>Die size hatte ich schon auf 2* int angepasst bzw so groß gemacht, dass es gehen sollte, aber trotzdem bekam ich immer nur einen wert an und sonst nur unsinns zahlen.<br />
Danke für den Tipp mit wireshark, werd ich mal versuchen.</p>
<p>Kann es sonst noch an HostByte und NetworkByte Order liegen und dass ich da meine Integer manuell konvertieren muss?</p>
<p>Gruß, peter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024162</guid><dc:creator><![CDATA[Peter.peter]]></dc:creator><pubDate>Mon, 21 Feb 2011 13:58:11 GMT</pubDate></item></channel></rss>