| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | char buffer[512]; memset(buffer,'o',512); Fra : Henrik Koksby Hansen | 
  Dato :  10-03-05 09:54 |  
  |   
            Hej,
 
 
 Det er ved at være lidt siden jeg kodede C++ sidst, men lige nu sidder
 jeg og roder med list sokkelprogrammering for første gang. Mit
 spørgsmål går egentligt ikke på sokkelprogrammering.
 
 For at teste klient/server ville jeg prøve at fylde bufferen helt vha.
 memset() og sende hele skidtet. Men der hægter sig et kryptisk tegn på
 i enden. Nogen der kan gi' en forklaring på hvor jeg tænker forkert?
 
 
 /* initialisering af socket og socket descriptor samt connect() */
 //[...]
 
 char buffer[512] = {0};
 sprintf(buffer, "test");
 
 //[...]
 
 memset(buffer,'o',512);
 if (send(my_socket, buffer, sizeof(buffer), 0) == -1)
 {
    printf("Error: send() %s\r\n", buffer);
    closesocket(my_socket);
    return 0;
 }
 printf("Success: send() %s\r\n", buffer);
 
 Output bliver nedenstående:
 
 ---
 Success: send()
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 oooooooooooooooooooooooooooooooooooooooooooooooo?
 ---
 
 Hvis jeg bruger memset(buffer,'o',511), så ser det flot ud.
 
 
 -- 
 Henrik
  
            
             |   |   
            
        
 
            
         
           Henrik Koksby Hansen (10-03-2005) 
         
	
            | Kommentar Fra : Henrik Koksby Hansen | 
  Dato :  10-03-05 10:31 |  
  |   
            Hej,
 
 Jeg prøver lige at svare mig selv.
 
 
 >For at teste klient/server ville jeg prøve at fylde bufferen helt vha.
 >memset() og sende hele skidtet. Men der hægter sig et kryptisk tegn på
 >i enden. Nogen der kan gi' en forklaring på hvor jeg tænker forkert?
 
 [...]
 
 >char buffer[512] = {0};
 >sprintf(buffer, "test");
 >
 >//[...]
 >
 >memset(buffer,'o',512);
 
 [...]
 
 >printf("Success: send() %s\r\n", buffer);
 
 [...]
 
 Problemet, tror jeg, er at jeg printer arrayet som en streng. Da hele
 array'et er fyldt ud [0-511] er der ingen slutkarakter og derfor
 fortsætter udskrivningen indtil den når en endekarakter.
 
 jeg prøvede at lave en løkke, som udskrev buffer[i] for i = 0 til 513
 og 
 
 buffer[511] indeholder det sidste 'o'.
 buffer[512] indeholder noget udefineret - det underlige tegn.
 buffer[513] indeholde noget udefineret, som i mit tilfælde var 0.
 Derfor stoppede udskrivningen der.
 
 
 Nyt spørgsmål: Jeg vil gerne gemme alle data i buffer-arrayet i en
 fil. Er der nogen smart måde at gøre dette på, udover en løkke? Jeg
 får nemlig den underlige karakter med, når jeg gemmer også. :(
 I øjeblikket benytter jeg noget lignende dette:
 
   ofstream outFile("fil.dat");
   outFile << buffer << ";";
 
 
 -- 
 Henrik
  
            
             |   |   
            
        
 
            
         
           Peter Jensen (10-03-2005) 
         
	
            | Kommentar Fra : Peter Jensen | 
  Dato :  10-03-05 10:57 |  
  |   
            Henrik Koksby Hansen wrote:
 
 > Nyt spørgsmål: Jeg vil gerne gemme alle data i buffer-arrayet i en
 > fil. Er der nogen smart måde at gøre dette på, udover en løkke? Jeg
 > får nemlig den underlige karakter med, når jeg gemmer også. :( I
 > øjeblikket benytter jeg noget lignende dette:
 >
 >   ofstream outFile("fil.dat");
 >   outFile << buffer << ";";
 
 Den underlige karakter kommer her med af samme grund som før.  Prøv
 dette:
 
 fstream outFile;
 outFile.open("fil.dat", ios::binary | ios::out);
 outFile.write(buffer, 512);
 outFile.close();
 
 -- 
 PeKaJe
 
 "Microsoft Wheel.  Now with 8 sides for a smoother ride."
    -- The Ghost in the Machine, in COLA
  
            
             |   |   
            
        
 
            
         
            Henrik Koksby Hansen (10-03-2005) 
         
	
            | Kommentar Fra : Henrik Koksby Hansen | 
  Dato :  10-03-05 13:43 |  
  |   
            >> Nyt spørgsmål: Jeg vil gerne gemme alle data i buffer-arrayet i en
 >> fil. Er der nogen smart måde at gøre dette på, udover en løkke? Jeg
 >> får nemlig den underlige karakter med, når jeg gemmer også. :( I
 >> øjeblikket benytter jeg noget lignende dette:
 >>
 >>   ofstream outFile("fil.dat");
 >>   outFile << buffer << ";";
 >
 >Den underlige karakter kommer her med af samme grund som før.  Prøv
 >dette:
 >
 >fstream outFile;
 >outFile.open("fil.dat", ios::binary | ios::out);
 >outFile.write(buffer, 512);
 >outFile.close();
 [...]
 
 Jeps. Det virker fortrinligt.
 
 Jeg havde godt regnet den ud, men udfra et hint fra en kollega. :)
 
 Jeg takker mange for svarene.
 
 
 
 -- 
 Henrik
  
            
             |   |   
            
        
 
            
         
           Peter Jensen (10-03-2005) 
         
	
            | Kommentar Fra : Peter Jensen | 
  Dato :  10-03-05 10:42 |  
  |   
            Henrik Koksby Hansen wrote:
 
 Jeg klipper lige lidt så problemet illustreres:
 
 > char buffer[512] = {0};
 
 [...]
 
 > memset(buffer,'o',512);
 
 [...]
 
 > printf("Success: send() %s\r\n", buffer);
 > 
 > Output bliver nedenstående:
 >
 > ---
 > Success: send()
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
 > oooooooooooooooooooooooooooooooooooooooooooooooo?
 > ---
 
 Det kan jo ikke overraske for meget.  Du prøver at printe en string der
 ikke har nogen som helst null-terminering!  Du er "heldig" med at der
 tilfældigvis er et null ikke så langt fra slutningen af din buffer, men
 i princippet kunne den blive ved med at læse garbage indtil programmet
 laver en access violation.
 
 > Hvis jeg bruger memset(buffer,'o',511), så ser det flot ud.
 
 Da kun fordi der tilfældigvis er et null på plads 512 i dit array.  Det
 er jeg ikke sikker på at du kan være garanteret ...
 
 -- 
 PeKaJe
 
 Word is a fine tool when you don't need your output to look identical on
 every machine that might use it. -- Erik Funkenbusch, Microsoft apologist
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |