PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C] Puffer, Nullbits und send()



nasontyphalt
22-02-2006, 13:48
Ahoi!

Wenn ich mir per strncpy und strncat ein Paket zusammenschnüre, wird doch das Nullbit immer automatisch drangehängt... oder?

Warum sendet send() dann auch all das was dahinter im Array steht?
Auch wenn ich per buffer[strlen(buffer)]='\0' das Nullbit (überflüssigerweise?) manuell einfüge... !?

ninguno
22-02-2006, 13:55
kannst du den code mal posten

nasontyphalt
22-02-2006, 14:23
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define BUFFER_LENGTH 4096

main(){

int s,bytes,count,count2;
char buffer[BUFFER_LENGTH],post[124],login[150],httpreq[256],timestamp_string[11],sessionID[13],phpsid[33];
struct sockaddr_in addr;
struct hostent *host;
time_t timestamp;

addr.sin_addr.s_addr = inet_addr(""xxx.xxx.xxx.xxx");
addr.sin_port = htons(80);
addr.sin_family = AF_INET;

s=socket(PF_INET,SOCK_STREAM,0);
if(s==-1)perror("socket()");

if(connect(s,(struct sockaddr*)&addr,sizeof(addr))==-1)perror("connect()");

strcpy(httpreq,"<Paketheaderinhalte>");

strcpy(post,"POST /Pfad");
strcat(post,httpreq);

strcpy(login,"<Paketinhalte>");
time(&timestamp);
sprintf(timestamp_string,"%i",timestamp);
strcat(login,timestamp_string);
strcat(login,"<Paketinhalte>");

if(send(s,post,sizeof(post),0)==-1)perror("send()");
if(send(s,login,sizeof(login),0)==-1)perror("send()");

bytes=recv(s,buffer,sizeof(buffer)-1,0);

if(bytes==-1)perror("recv()");
buffer[bytes]='\0';
printf("\n\n%s\n\n",buffer);

for(count=0;count<strlen(buffer);count++){
if(buffer[count]=='D' && buffer[count+1]=='='){
count+=2;
for(count2=0;count2<=31;count2++){
phpsid[count2]=buffer[count++];
}
phpsid[32]='\0';
}
else if(buffer[count]=='n' && buffer[count+1]=='='){
count+=2;
for(count2=0;count2<=11;count2++){
sessionID[count2]=buffer[count++];
}
sessionID[12]='\0';
count=strlen(buffer);
}
}
printf("\n\nsessionID=%s\n\nPHPSID=%s\n\n",sessionID,phpsid);

/* Bis hier funktioniert alles wie es soll, zumindest wenn man sich den mitgesnifften Output ansieht! */

strcpy(buffer,"GET /Pfad");
strcat(buffer,sessionID);
strcat(buffer,"&PHPSESSID=");
strcat(buffer,phpsid);
strcat(buffer," HTTP/1.1");
strcat(buffer,httpreq);

printf("\n\n%s\n\n",buffer);

/* Der Inhalt des Puffers wurde ausgegeben, alles scheint normal... */

if(send(s,buffer,sizeof(buffer),0) == -1) perror("send()");
bytes=recv(s,buffer,sizeof(buffer)-1,0);
if(bytes==-1){perror("recv()");}
else{printf("%s",buffer);}

/* Der Inhalt des Puffers wird ausgegeben und sieht komplett so aus wie beim letzten mal... */

close(s);
}


strncpy etc. habe ich noch nicht umgesetzt, da ich erstmal die Anzahl der potentiellen Fehlerquellen gering halten wollte und habe deshalb noch strcpy etc. benutzt... ohne erfolg... ;)

nasontyphalt
22-02-2006, 14:26
Im Prinzip macht es doch nichts, wenn die Arrays größer sind, als die Strings, die hineingeschrieben werden. Wird das Array ausgelesen, müsste doch beim Nullbit des eingefügten Strings schluss sein?

Vincent Vega
22-02-2006, 23:20
man send.

Der Parameter ist kein char * sondern ein void *. Das deutet darauf hin (und wahrscheinlich steht's irgendwo in der man page auch so drin), dass der Parameter eben kein C-String ist, sondern ein Zeiger auf einen Speicherbereich, dessen Größe mit angegeben wird (durch Parameter Nummer 3). Du könntest mit send() auch rein binäre Daten verschicken, z.B. einen komprimierten Datenstrom, da wäre es dann schlecht wenn NULL den Buffer terminieren würde.

nasontyphalt
23-02-2006, 00:21
Aber sizeof() zählt doch nur bis zum Nullbit, oder nicht?

Joghurt
23-02-2006, 00:42
Nein. sizeof gibt nur die größe des Datentyps an.

sizeof(char*) ist z.B. meistens 4, da ein Pointer auf 32bit Rechnern 4 Byte lang ist.

sizeof(buffer) gibt BUFFER_LENGTH, da du ihn als char buffer[BUFFER_LENGTH] definiert hast.

strlen zählt bis zum Nullbyte.

BTW: Nullbyte, nicht Nullbit

nasontyphalt
23-02-2006, 08:28
Aaaaaaahhh! Verstehe! :D

Danke!