15. januar 2003 - 19:56Der er
17 kommentarer og 1 løsning
Send fil
Jeg er ved at lege lidt med en socket connection. Formålet er at lave et lille program der kan sende en fil, uafhængig af størrelsen, til et modtager program (som er lavet).
Flowet er således: åbn connection sendFile("file.bin"); luk connection
Det er min opfattelse at man laver ét kald til send når man vil sende data via en (TCP)socket - er det korrekt ?
At læse hele filen ind i RAM og derefter sende den må da kunne optimeres - det er da ihvertfald ikke sjovt at skulle sende 1GB.. ?
Endnu en grund til at loope er at send returnerer -1 ved fejl, men eller antal bytes sendt. Og jeg har ikke kunnet findet noget sted, hvor der garanteres, at den enten returnerer -1 eller det antal bytes du har bedt den sende. Deraf kunne man frygte at ihvertfald nogle implementationer ville kun sende en mindre bid. Hvorfor man alligevel skal loope.
Ikke helt rigtigt. Jeg har lige fundet en side som hævder: If the message is too long to pass atomically through the underlying protocol, then the error EMSGSIZE is returned, and the message is not transmitted.
Nå, men jeg har indtil videre løst det ved at sende 1024 bytes ad gangen. Det giver dog lidt problemer da jeg godt kunne tænke mig at medsende en md5 sum af filen - så jeg kan verificere filen ved modtagelsen. Det virker ihvertfald lidt dumt at læse hele filen først - for at kunne generere en md5 - for dernæst at sende den i små bidder.
Og fandt dokumentation for at send sender alle byte atomisk i forhold til den underliggende protokol *eller* giver fejl.
Og konklusionen var derfor at du skulle holde dig under det den underliggende protokol kan klare. Og det er hvis jeg husker rigtigt 1536 bytes minus overhead.
"hvorfor bruger du ikke stat/fstat i.s.f. fseek+ftell ?" Fordi programmet skal virke med Windows og Linux - og mig bekendt findes stat/fstat ikke på Windows ?
"Og kan du ikek løse 2 gennemløsb problemet ved at sende MD5 til sidst ?" Tjooo, jeg kunne vel update min digest for hver buffer jeg sender og gøre det samme ved modtagelsen. Det vil jeg prøve.
Om der er nogen fordel ved stat/fstat fremfor fseek/ftell ?
Effektivitetmæssigt tror jeg ikke, at der den store forskel, da jeg formoder, at fseek end stort set laver det samme som stat/fstat.
(det ville ihvertfald være en meget bøvet implementation at læse hele filen !)
Men jeg synes måske at koden var nemmere at forstå med fstat og st_size.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.