Nullterminierung bei u_char *?
-
hallo,
ich habe einen variable "u_char *payload;", wenn ich diese variable nun ausgeben moechte nachdem ich ueber das netzwerk daten empfangen habe, kommt da ziemlicher muell raus. ich habe schon etwas der artpayload[ len ] = 0;
probiert, doch der compiler meldet dann immer:
proc.c:182: assignment of read-only locationhat jemand von euch eine idee, wie man die nullterminierung anhaengen kann?
ciao, cypoc
-
auf was zeigt payload denn?
-
eth_siz = sizeof( struct ether_header ); iphdr = ( struct ip* )( packet + eth_siz ); ip_siz = ( iphdr->ip_hl << 2 ); tcp = ( struct tcphdr* )( packet + eth_siz + ip_siz ); tcp_siz = ( tcp->doff << 2 ); payload = ( u_char * )( packet + eth_siz + ip_siz + tcp_siz );
also ich schreibe gerade ein programm mithilfe von libpcap.
ich bekomme ein paket const u_char *packet. packet enthaelt header-infos und danach die daten. ich will nur die daten. das funktioniert soweit auch ganz gut nur die nullterminierung geht nicht...ich weiss nicht ob der code-schnipsel da oben was gebracht hat?!
ciao, cypoc
ps: @belgarad: email bekommen?!
-
payload ist deiner Beschreibung nach ein Pointer auf const, klar dass du den Inhalt nicht verändern kannst. Vielleicht solltest du payload mit einer Funktion ausgeben, der du eine Länge statt eines nullterminierten Strings übergibst, z.b. fwrite.
-
richtig! payload ist als const u_char * definiert. mal wieder typisch ich.
kannst du das ausgeben per fwrite etwas genauer erlaeutern?! bis jetzt kapier ich nicht sehr viel.aber danke erstmal fuer eure bemuehungen!
ciao, cypoc
-
naja ich unterstelle mal, dass du sowas in der Art versucht hast:
printf("Payload: %s\n", payload);
Aber das hat zuviel Müll ausgegeben, weil nach payload nicht rein zufällig ein Nullbyte stand. Hinschreiben kannst du keins ... also hast du jetzt grundsätzlich 2 Möglichkeiten: 1) Du kopierst den ganzen Salat in beschreibbaren Speicher und hängst von Hand ein \0 an. 2) Du weißt, wieviele Zeichen das sind, und gibst genau soviele aus. Das kann man zB folgendermaßen machen:
for (unsigned i = 0; i < len; ++i) putchar(payload[i]); // oder: fwrite(payload, 1, len, stdout);
-
wunderbar! herrlich! das funktioniert wie geschmiert!
eine frage noch: ich hatte eigentlich vor das ganze mit iostream ( bzw. fstream ) zu machen. ich kann mit fwrite aber wahrscheinlich nicht in einen ofstream schreiben, oder?!VIELEN DANK!
ciao, cypoc
-
nee, aber da gibts dann eben die write-Methode.
-
naja, ich denke mir wird da schon was einfallen, wenn nicht, bin ich wieder hier.
danke nochmal!
ciao