|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Socket forbindelse - blanding af binære og~ Fra : Karl Peder Olesen |
Dato : 04-01-03 14:06 |
|
Hej
Jeg sidder lige og roder lidt med noget socket kommunikation, og har
fået opbygget en kommunikation baseret på noget XML. Mit problem
opstår fordi jeg gerne vil kunne oploade en fil til serveren - dvs.
overføre binære data også.
Jeg havde tænkt mig et mønster ala:
1) Client: Request på upload (inkl. filnavn)
2) Server: Response = kom med filen
3) Client: Sender filen som en strøm af binære data
4) Server: Response = upload ok (eller fejl).
XML kommunikationen (e.g. step 1, 2 og 4) har jeg hånd om (tror jeg
da), men der er problemer med step 3:
Jeg (serveren) kan ikke finde ud af hvornår de binære data slutter -
dvs. hvornår hele filen er oploaded. Derfor "hænger" serveren, og når
aldrig til step 4. Er der nogen der kan hjælpe? Hvad gør man -
specielt stoptegn / overføre filstørrelse i step 1 (*) / ...?
(*): Hvis løsningen er at sende filstørrelsen, og så lade serveren
være i step 3 indtil det rigtige antal bytes er sendt, hvordan undgår
man så at serveren hænger hvis overførslen afbrydes? Det samme gælder
vel egentligt hvis løsningen er at anvende et specielt stop tegn.
på forhånd tak for hjælpen
Karl Peder
| |
Lasse Reichstein Nie~ (04-01-2003)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Lasse Reichstein Nie~ |
Dato : 04-01-03 16:40 |
|
kpo@mail1dotstofanetdotdk (Karl Peder Olesen) writes:
[overføre binære data]
> Hvad gør man -
> specielt stoptegn / overføre filstørrelse i step 1 (*) / ...?
Begge er en mulighed.
Hvis man bruger stoptegn, så skal man forhindre at stoptegnet optræder
ellers. Det er svært med binære data, og man skal til at escape tegnet
når det optræder normalt. Alt i alt noget rod.
Man kunne også sende data i blokke, og hver blok har så en lille
header der fortæller blokken størrelse, og om der kommer flere blokke
bagefter. Evt. kan blokkene have en fast størrelse, undtagen den sidste,
som så er markeret specielt.
> (*): Hvis løsningen er at sende filstørrelsen, og så lade serveren
> være i step 3 indtil det rigtige antal bytes er sendt, hvordan undgår
> man så at serveren hænger hvis overførslen afbrydes? Det samme gælder
> vel egentligt hvis løsningen er at anvende et specielt stop tegn.
Det er noget nemmere at overføre filstørrelsen først. Hvis forsendelsen
bliver afbrudt, så bør det kunne ses på TCP-forbindelsen at den ene ende
lukker. Serveren skal altså holde øje med forbindelsen undervejs. Den kan
også vælge at lave et timeout efter et stykke tid uden data, men det skulle
TCP-forbindelsen selv gøre. Sørg evt. for at skulle sende lidt information
tilbage under overførslen, så bliver en afbrudt forbindelse måske hurtigere
opdaget, da der ikke kommer nogen ack-pakker tilbage.
Jeg vil mene at den bedste måde at vide hvor meget der skal overføres,
er at sende størrelsen først.
--
Lasse Reichstein Nielsen - lrn@hotpop.com
'Faith without judgement merely degrades the spirit divine.'
| |
Karl Peder Olesen (05-01-2003)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Karl Peder Olesen |
Dato : 05-01-03 10:30 |
|
On 04 Jan 2003 16:39:55 +0100, Lasse Reichstein Nielsen
<lrn@hotpop.com> wrote:
<snip>
>
>Begge er en mulighed.
>
>Hvis man bruger stoptegn, så skal man forhindre at stoptegnet optræder
>ellers. Det er svært med binære data, og man skal til at escape tegnet
>når det optræder normalt. Alt i alt noget rod.
>
>Man kunne også sende data i blokke, og hver blok har så en lille
>header der fortæller blokken størrelse, og om der kommer flere blokke
>bagefter. Evt. kan blokkene have en fast størrelse, undtagen den sidste,
>som så er markeret specielt.
>
<snip>
>
>Jeg vil mene at den bedste måde at vide hvor meget der skal overføres,
>er at sende størrelsen først.
>
<snip>
Takker for input. Jeg lader nu klienten sende filstørrelsen først - da
den i forvejen sendte en request på upload inkl. filnavn, så
inkluderede jeg størrelsen her. Det ser ud til at virke fint.
Jeg har ikke forsøgt at dele overførslen op i blokke, som du også
foreslår, da det ser ud til at virke fint når hele filen overføres i
en bid.
mvh
Karl Peder
| |
Lasse Westh-Nielsen (04-01-2003)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Lasse Westh-Nielsen |
Dato : 04-01-03 18:18 |
|
"Karl Peder Olesen" <kpo@mail1dotstofanetdotdk> wrote in message
news:3e16da75.249445443@news.stofanet.dk...
> Jeg (serveren) kan ikke finde ud af hvornår de binære data slutter -
> dvs. hvornår hele filen er oploaded. Derfor "hænger" serveren, og når
> aldrig til step 4. Er der nogen der kan hjælpe? Hvad gør man -
> specielt stoptegn / overføre filstørrelse i step 1 (*) / ...?
>
> (*): Hvis løsningen er at sende filstørrelsen, og så lade serveren
> være i step 3 indtil det rigtige antal bytes er sendt, hvordan undgår
> man så at serveren hænger hvis overførslen afbrydes? Det samme gælder
> vel egentligt hvis løsningen er at anvende et specielt stop tegn.
Jeg læste lige lidt i min gamle bog om distribuerede systemer; "Stallings:
Data & computer communication".
Her står om FTP (som lidt ligner det du laver) at man kan gøre følgende:
1) Klienten og serveren snakker sammen på forbindelse #1 om at de vil lave
en overførsel.
2) Når de er blevet enige, opretter de en ny forbindelse, forbindelse #2!
3) Klienten sender alle data over forbindelse #2 uden overhead.
4) Når overførslen er færdig bruger klienten og serveren forbindelse #1 til
at kommunikere omkring afslutningen af overførslen.
Hertil kan man måske tilføje:
3.1) Klienten og serveren kan bruge forbindelse #1 til at sende "keep alive"
beskeder eller lignende til hinanden.
Mvh Lasse
| |
|
|