FTP arkitektur
Hej EksperterJeg sidder og roder med et sommerferieprojekt, for at lære lidt om FTP.
Jeg har lavet en lille klient, der kan det mest basale, men jeg er rendt ind i et par problemer, der er af mere arkitekturmæssig karakter:
Som udgangspunkt er kommunikationen mellem klient og server bygget op omkring "forespørgsel -> svar". Altså klienten sender f.eks. et CDUP (change directory up) og serveren svarer tilbage om resultatet. Det betyder at man som udgangspunkt kan forudsige hvad der kommer, og hvor meget. Problemerne opstår når i to situationer:
a) Serveren sender et "421 No-transfer-time exceeded. Closing control connection.". Her er der ikke gået en forespørgsel forud, hvorfor klienten ikke kan forudsige at 421 kommer. Hvis klienten så i samme øjeblik har sendt et CDUP får den altså et uvendtet svar, og hvis klienten ikke har sendt en forespørgsel er den ikke klar til at læse.
b) Data (f.eks. filer) overføres af en tråd, for at klienten ikke skal "hænge" medens filen overføres. Når overførslen er overstået sendes et "226 transfer complete" på kontrolforbindelsen. Det betyder at det er uforudsigeligt hvilke svar man får på en forespørgsel, da der kan snige sig et 226 ind midt i det hele. Alternativt kan filoverførseltråden selv læse den næste linie, men så risikerer man at man snupper resultatet af CDUP i stedet for 226.
Hmm håber i kan følge mig
Problemet er altså at finde en arkitektur som sikrer at alle svar bliver læst, både dem der er forventede og dem som ikke er, samt at den der sender en forespørgsel får det rigtige svar.
Jeg har tænkt på at lave en tråd der foretager al læsninge, og så raiser en event hvis den får en 421, og "ligger 226 til side". Problemet er at jeg ikke lige umidelbart kan finde en metode hvorpå man kan forespørge en stream om der er data på den. Derfor får jeg en tråd der kan gå i deadlock, hvilket jeg ikke ønsker.
Altså tanken er:
main tråd der primært laver UI, og forespørgsler
1 kontrolstream readertråd der læser alt og ligger resultater i en buffer
en række datareader/writer streams der overfører data.
Jeg har brug for indput!
Egentligt kan jeg opsumere:
Hvilken arkitektur understøtter muligheden for sideløbende dataoverførsler samtidig med forespørgsler/respons på kontrolstreamen, uden at der går synkroniserings skruder-muder i det hele :)