|
| 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
| |
|
|