Integer Senden und Empfangen



  • Hallo!

    Ich habe eine Frage bezüglich UDP Programmierung mit C++:

    Und zwar hielt ich mich bis jetzt an das Tutorial und den Example Code von www.gafferongames.com und der funktionierte auch wunderbar.
    Doch jetzt würde ich gerne nicht mehr strings verschicken, sondern mehrere Integer.

    Der Original Code lautet in etwa:

    unsigned char packet[] = "server to client";
    connection.SendPacket( packet, sizeof( packet ) );
    

    Die SendPacket Methode:

    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 >> 24 );
    			packet[1] = (unsigned char) ( ( protocolId >> 16 ) & 0xFF );
    			packet[2] = (unsigned char) ( ( protocolId >> 8 ) & 0xFF );
    			packet[3] = (unsigned char) ( ( protocolId ) & 0xFF );
    			memcpy( &packet[4], data, size );
    			return socket.Send( address, packet, size + 4 );
    		}
    

    und die Send Methode:

    bool Send( const Address & destination, const void * data, int size )
    		{
    			assert( data );
    			assert( size > 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*)&address, sizeof(sockaddr_in) );
    
    			return sent_bytes == size;
    		}
    

    Jetzt hab ich versucht einfach in den packet parameter von SendPacket() nen int array reinzuschieben. Das klappt auch zum teil.
    Und zwar, wenn ich mir das angekommene anschaue, finde ich den ersten integer von dem array wieder, aber der zweite fehlt komplett.

    Das hier ist noch der receive code:

    int Receive( Address & sender, void * data, int size )
    		{
    			assert( data );
    			assert( size > 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*)&from, &fromLength );
    
    			if ( received_bytes <= 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;
    		}
    
    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 <= 4 )
    				return 0;
    			if ( packet[0] != (unsigned char) ( protocolId >> 24 ) || 
    				 packet[1] != (unsigned char) ( ( protocolId >> 16 ) & 0xFF ) ||
    				 packet[2] != (unsigned char) ( ( protocolId >> 8 ) & 0xFF ) ||
    				 packet[3] != (unsigned char) ( protocolId & 0xFF ) )
    				return 0;
    			if ( mode == Server && !IsConnected() )
    			{
    				printf( "server accepts connection from client %d.%d.%d.%d:%d\n", 
    					sender.GetA(), sender.GetB(), sender.GetC(), sender.GetD(), sender.GetPort() );
    				state = Connected;
    				address = sender;
    			}
    			if ( sender == address )
    			{
    				if ( mode == Client && state == Connecting )
    				{
    					printf( "client completes connection with server\n" );
    					state = Connected;
    				}
    				timeoutAccumulator = 0.0f;
    				memcpy( data, &packet[4], size - 4 );
    				return size - 4;
    			}
    			return 0;
    		}
    

    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 🙂
    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 www.gafferongames.com zu finden!

    Dank und Gruß, peter



  • 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.

    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.



  • 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.
    Danke für den Tipp mit wireshark, werd ich mal versuchen.

    Kann es sonst noch an HostByte und NetworkByte Order liegen und dass ich da meine Integer manuell konvertieren muss?

    Gruß, peter


Anmelden zum Antworten