|
| Problemer med realloc() Fra : Thomas K |
Dato : 14-03-03 01:07 |
|
Hej C folk
Jeg er ved at lave et projekt, hvor vi skal benytte os af
socketprogrammering. Jeg har fundet noget information, og er kommet godt
i gang med at kode. Jeg har erfaret at når man fra serverens side skal
modtage noget med recv(), så skal man angive et fast antal bytes, som
man skal nedtage. Mit problem ligger så i at det jeg ønsker at overføre
er en tekst fil, hvis størelse ikke nødvendigvis er deleligt med det
faste antal bytes, som recv() modtager. Dette gør så at den sidste blok,
som recv() modtager er for stor. Dvs, at der er nogle bytes, som jeg
ikke vil have med. Der kommer altså til at stå noget information i den
sidste del af blokken, som ikke skal være der. Jeg har så forsøgt at
skære det væk på følgende måde:
printf("Sidste pakke modtaget, indeholdende %d bytes.\n", count);
msg =(char*)realloc(msg, (100-count));
printf("Kommer jeg ned til dette snot!\n");
Problemet er at jeg aldrig kommer ned i den anden printf.
count indeholder, hvor mange bytes, som jeg vil beholde i mit af mit
msg-array. Og msg er så den variable, som jeg gerne vilbeholde og skrive ud.
Er der nogen der kan fortælle mig, hvad jeg gør galt med realloc? Jeg
har prøvet mangt og meget, men jeg sidder simpelthen fast... (Grrr)
Jeg bruger gcc 3.2, hvis der har betydning.
På forhånd tak for hjælpen
Mvh
/Thomas
| |
Peter F (14-03-2003)
| Kommentar Fra : Peter F |
Dato : 14-03-03 09:07 |
|
> Jeg er ved at lave et projekt, hvor vi skal benytte os af
> socketprogrammering. Jeg har fundet noget information, og er kommet godt
> i gang med at kode. Jeg har erfaret at når man fra serverens side skal
> modtage noget med recv(), så skal man angive et fast antal bytes, som
> man skal nedtage. Mit problem ligger så i at det jeg ønsker at overføre
> er en tekst fil, hvis størelse ikke nødvendigvis er deleligt med det
> faste antal bytes, som recv() modtager.
>Dette gør så at den sidste blok, som recv() modtager er for stor. Dvs, at
der
>er nogle bytes, som jeg ikke vil have med.
Næppe. Du modtager de data som faktisk modtages. Måske beder du om 1000
bytes men der ankommer kun 100. Det er så de 100 du får. Dit recv kald giver
dig garanteret antallet af reeelt modtagne bytes.
>Der kommer altså til at stå noget information i den
> sidste del af blokken, som ikke skal være der. Jeg har så forsøgt at
> skære det væk på følgende måde:
>
> printf("Sidste pakke modtaget, indeholdende %d bytes.\n", count);
> msg =(char*)realloc(msg, (100-count));
> printf("Kommer jeg ned til dette snot!\n");
>
> Problemet er at jeg aldrig kommer ned i den anden printf.
> count indeholder, hvor mange bytes, som jeg vil beholde i mit af mit
> msg-array. Og msg er så den variable, som jeg gerne vilbeholde og skrive
ud.
>
> Er der nogen der kan fortælle mig, hvad jeg gør galt med realloc? Jeg
> har prøvet mangt og meget, men jeg sidder simpelthen fast... (Grrr)
Hvis situatione bare er at din buffer inde holder ex 100 bytes men er 1000
bytes stor, og det er tekst som bare skal printes så prøv med.
printf("Sidste pakke modtaget, indeholdende %d bytes.\n", count);
DinBuffer[count]=0;
printf("%s",DinBuffer);
På den måde afslutter du din tekst med 0 som får printf til at stoppe
udskrivningen af teksten. Med andre ord skriver du kun den tekst der faktisk
er.
At reallokere for at opnå denne bortkæring virker lidt underligt. Ofte
ønsker man en buffer til at modtage data i som er konstant eksisterende. Så
håndterer man at data ikke altid fylder hele bufferen.
| |
|
|