/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste