C/C++: Buffer richtig und sinnvoll füllen:

CapJo

Admiral Special
Mitglied seit
19.04.2002
Beiträge
1.488
Renomée
17
Standort
nähe Landshut
Ich habe Daten die per TCP/IP verschickt werden sollen.

Die Daten werden ja zuerst in einen Buffer geschrieben und dieser Buffer wird dann verschickt.

Wie bringe ich die Daten oder z. B. eine Datenstruktur in diesen Buffer?

Ich habs z. B. mit einem Short-Wert probiert und zwar wie folgt.

...
short zahl = 128;
char buffer[4];
*buffer = zahl;
cout << (short)*buffer << endl;
...
Ausgabe = -128

Mit Zahlen größer 127 geht das schief weil versucht wird diese in ein einzelnes Char-Feld zu schreiben.

Ich hab mir das ganze im Debugger angeschaut und versteh nicht warum nicht einfach die Adresse des Pointer genommen wird und einfach der Wert ab der Pointer-Adresse in den Speicher geschrieben wird?

Was für sinnvolle Lösungen gibt es da?
 
Zuletzt bearbeitet:
Das gleiche Problem mit Lösung hab ich hier im Forum gefunden:
http://www.source-code.de/viewtopic.php?t=547&highlight=buffer

Gibt es noch Alternativen?

Code:
Hallo,
hier mal ein Beispiel...
C/C++:

#include <conio.h>
#include <stdio.h>
#include <alloc.h>

struct beispiel{
     int a;
     int b;
     int c;
};

void main(void)
{
  char* buffer;
  beispiel bsp;
  char s[10];

  // Reserviert Speicher
  buffer = (char*) malloc(sizeof(beispiel));

  // Wert Zuweisen
  bsp.a = 10;

  // Kopiert den Struct in den angelegten Buffer
  memcpy(buffer, (char*) &bsp, sizeof(beispiel));

  // Als Test Variable zurücksetzen
  bsp.a = 0;

  // Aus dem Buffer wieder in den Struct kopieren
  memcpy(&bsp, buffer, sizeof(beispiel));

  // Speicher freigeben
  free(buffer);

  // Ergebniss anzeigen
  sprintf(s, "%d", bsp.a);
  printf(s); // Gibt 10 aus

  // Aus Tastendruch warten...
  getch();
}

Hab ich aus einem anderen Forum ... so in etwa hab ich es auch schon probiert ... ich muss morgen mal schauen wo der Fehler lag
 
CapJo schrieb:
aus diesem short zahl = 128;
char buffer[4];
*buffer = zahl;
cout << (short)*buffer << endl;

*(short*)buffer = ...

was aber nicht ganz schön ist.

Sinvoller ist es mt unions zu arbeiten:

Code:
union FOO
{
char *ch_buf;
short *sh_buf;
long *lo_buf;
};


union FOO foo;

foo.ch_buf = malloc(size);
und nun kannst du das machen, was du möchtest.
 
Ich will eine Datenstruktur variabler Länge über TCP/IP versenden. Dazu wollte ich den Buffer mit der Länge der zu empfangen Daten füllen und dann mit den eigentlichen Daten. Die Datenstruktur daten ist nur zum Testzweck.

Buffer:
Länge der Daten als Int | Daten variabler Länge .........................................

Folgendes hab ich produziert und es funktioniert nach ewigem Debuggen ...
Ich hatte da einen kleinen Fehler den ich dauernd übersehen habe ...

PHP:
#include "windows.h"
#include "stdafx.h"
#include "stdio.h"
#include "iostream.h"
#include "string.h"
#include "stdlib.h"
#include <malloc.h>

struct daten{
	int a;
	int b;
	int c;
	};

int main(int argc, char* argv[])
{

daten dat[3];

dat[0].a=1;
dat[0].b=2;
dat[0].c=3;

dat[1].a=4;
dat[1].b=5;
dat[1].c=6;

dat[2].a=7;
dat[2].b=8;
dat[2].c=9;

int size_array = sizeof(dat);
 
char *buffer = (char*)malloc((sizeof(size_array)+sizeof(dat)));

memcpy(buffer, (char*)&size_array, sizeof(size_array));
memcpy((buffer+sizeof(size_array)), (char*)&dat, sizeof(dat));

// Ende Sende-Seite sozusagen Anfang von TCP/IP
char c[60];
memcpy(c, buffer, 60);
// Anfang Empfangsseite

daten empf[3];
int sizeOF;

memcpy(&sizeOF, c, sizeof(sizeOF));
memcpy(&empf, c+sizeof(sizeOF) , sizeOF);

cout << "empf[0].a = " << empf[0].a << endl;
cout << "empf[2].c = " << empf[2].c << endl;
 
free(buffer);

return 0;
};

Er gibt nach einigem Speicher herumkopieren die richtigen Werte 1 und 9 wieder aus dem Speicher heraus.

Wie bekommt man eigentlich die Größe eines "allokierten Speichers" den man über einen Pointer erreicht heraus?

char *buffer = (char*)malloc((sizeof(size_array)+sizeof(dat)));

sizeof(buffer) ... das ist dann die Größe des Pointers
sizeof(*buffer) ... das ist die Datenstruktur auf die der Pointer zeigt

und die "echte Größe" des reservierten Speichers auf den der Pointer zeigt?
 
Zuletzt bearbeitet:
CapJo schrieb:
und die "echte Größe" des reservierten Speichers auf den der Pointer zeigt?

Gar nicht, soweit ich weiß. Mußt du dir halt merken, was man alloziert hat.

OK, ums rumkopieren wirst du wohl nicht wirklich herumkommen, aber jetzt habe ich verstanden, was du möchtest.

Naja, dann würde ich es dennoch statt

memcpy(buffer, (char*)&size_array, sizeof(size_array));

*(int*)buffer = size_array;

machen. Klappt genauso gut und sparst dir einen memcpy Aufruf.

Beim Empfangen gehts genauso:

sizeOF = *(int*)c;

HTH.
 
Danke.

Du hast recht sollte so effizienter und einfacher gehen.

Morgen gehts wieder weiter vielleicht brauch ich ja noch Hilfe, aber ich weis ja an wen ich mich jetzt wenden kann ;D 8) :-*
 
Zurück
Oben Unten