Anzeige:
Ergebnis 1 bis 8 von 8

Thema: [C] Puffer, Nullbits und send()

  1. #1
    Registrierter Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    25

    [C] Puffer, Nullbits und send()

    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... !?

  2. #2
    Registrierter Benutzer
    Registriert seit
    30.06.2005
    Beiträge
    155
    kannst du den code mal posten
    religion is a virus from outer space

  3. #3
    Registrierter Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    25
    Code:
    #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...

  4. #4
    Registrierter Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    25
    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?

  5. #5
    Registrierter Benutzer
    Registriert seit
    23.12.2005
    Beiträge
    16
    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.

  6. #6
    Registrierter Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    25
    Aber sizeof() zählt doch nur bis zum Nullbit, oder nicht?

  7. #7
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    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
    Geändert von Joghurt (23-02-2006 um 00:44 Uhr)

  8. #8
    Registrierter Benutzer
    Registriert seit
    04.01.2006
    Beiträge
    25
    Aaaaaaahhh! Verstehe!

    Danke!

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •