Hjemmeeksamen 2: filnavigator for terminalvinduer

Utlevering: onsdag 5. November 2014

Innlevering: mandag 24. November, kl 23:59

Denne hjemmeeksamen g?r ut p? ? programmere to program: tjener og klient. Det skal brukes programmeringsspr?ket C, og koden som leveres skal fungere med kompilatoren gcc p? Ifis Linux-maskiner. Det skal skrives en rapport.

Hjemmeeksamen er karaktertellende for kurset (ca. 25%). All kode m? v?re skrevet selv: det er ikke lov ? hente kode fra annet hold eller dele egen kode med andre. Det er derimot tillatt – og vi oppfordrer sterkt til – ? diskutere problemer og utveksle kunnskap med andre studenter. (Men alts? ikke dele kode direkte.)

Det er viktig at du leser eget avsnitt om hvordan oppgaven skal leveres inn.

Introduksjon

For ? finne fram p? sin lokale harddisk, bruker man veldig ofte verkt?y som for eksempel en lokal filnavigator. P? Ifi bruker vi i tillegg NFS, som gj?r at operativsystemet lar det se ut som om filer som ligger p? filtjeneren ogs? er lokale, men i mange andre sammenhenger bruker man spesielle filnavigatorer for slike eksterne filer. Det skjer ofte at man bruker web-browseren bevisst eller ubevisst som filnavigator for eksterne filer n?r man finner en lesbar katalog uten index.html; webtjeneren sender til web-browseren en liste over filer i katalogen inklusive st?rrelsesinformasjon. Den tilbyr ogs? mulighet til ? vise filene hvis rettighetene stemmer.

Oppgaven

I denne oppgaven skal dere lage en tjener (filtjener) og en klient (filnavigator) som gj?r det mulig ?:

  • navigere mellom alle kataloger innenfor den katalogen som tjeneren startes i, men aldri utenfor denne katalogen
  • vise innholdet i den aktuelle katalogen
  • forandre den aktuelle katalogen (change directory)
  • velge et navn fra den aktuelle katalogen og skrive ut filtypen: om navnet tilsvarer en vanlig fil, en katalog, en link eller en type spesialfil
  • velge et navn fra den aktuelle katalogen og skrive innholdet ut p? klientens skjerm (erstatt tegn som ikke er ?printable? med punktum, da disse ikke kan skrives til skjerm)

Klienten og tjeneren skal kommunisere over en TCP-forbindelse. Klienten skal kj?re i et terminalvindu og ikke ?pne flere vinduer. (For interesserte er det lov ? bruke Ncurses, men det gir ikke ekstra uttelling.) Klienten skal tilby funksjonene sine i en interaktiv dialog, som for eksempel kan se slik ut:

  cmd (? for help)> ?
  ! You are connected to the server
  ! Please press a key:
  ! [1] list content of current directory (ls)
  ! [2] print name of current directory (pwd)
  ! [3] change current directory (cd)
  ! [4] get file information
  ! [5] display file (cat)
  ! [?] this menu
  ! [q] quit
  cmd (? for help)> 2
  ! /ifi/fenris/p13/nd
  cmd (? for help)> 3
  new dir (? for help)> ?
  ! ..     the parent directory
  ! / a new absolute directory
  !   a new directory relative to the current position
  ! [?]    this menu
  ! [q]    leave this menu
  new dir (? for help)> ..
  ! OK
  cmd (? for help)> 1
  ! README
  ! loesfors
  ! loesfors.tgz
  cmd (? for help)> 4
  ! Get file information for:
  ! [1] README
  ! [2] loesfors
  ! [3] loesfors.tgz
  ! [q] leave this menu
  file (? for help)> 3
  ! loesfors.tgz is a regular file
  cmd (? for help)> q

All kommunikasjon skal skje over en TCP-forbindelse. Klienten skal n? ikke lese fra disk. Klienten skal lytte til b?de input fra brukeren og data fra serveren. Tjeneren skal v?re i stand ? opprettholde forbindelse med flere klienter samtidig og ha en egen ?aktuelle katalog? for enhver klient. I neste avsnitt beskrives alle sp?rsm?l som skal besvares, inklusive programmeringsdelen beskrevet over.

Oppgaven i detalj

  1. Ved bruk av TCP er det viktig ? lage en egen protokoll (applikasjonslags-protokoll) p? toppen av Berkeley socket laget. Hvilke egenskaper har TCP som gj?r denne protokollen s? viktig?
  2. Hvordan ser din applikasjonslags-protokoll ut? Begrunn designet!
  3. Ta hensyn til maskinarkitekturen! Hva kan g? galt? Ville programmet ditt virke hvis du kompilerer og kj?rer tjeneren din p? en arkitektur med Big Endian, og klienten p? en av Linux-maskinene i Ifis terminalstuer?
  4. Programmet ditt bruker forbindelsesorientiert kommunikasjon, men nettfilsystemet NFS bruker hovedsaklig forbindelsesl?s kommunikasjon. Hvilke problemer unng?r du i programmet ditt ved ? bruke forbindelsesorientiert kommunikasjon?
  5. Hvilke muligheter tilbyr Linux og Berkeley socket APIen for ? utvikle tjenere som kan oppretteholde flere forbindelser samtidig, og som kan kommunisere med flere klienter samtidig? Hvilken av mulighetene har du valgt og hvorfor?
  6. Implementer filnavigatoren og filtjeneren.
    • Bruk flere filer, f.eks. slik at du skriver applikasjonslags-protokollen din én gang og bruker koden b?de i klienten og tjeneren.
    • Det m? v?re mulig ? kompilere og testkj?re programmene dine p? Linux-maskinene i Ifis terminalstuer.
    • Tjeneren skal ta et portnummer som kommandolinje-argument.
    • Klienten skal ta et maskinnavn og et portnummer som kommandolinje-argumenter.

Kompilering av koden

For ? kompilere koden skal dere lage en Makefile (see info make) slik at man bare kan skrive make i katalogen hvor filene er lagret for ? kompilere programmet. Makefilen skal ogs? leveres inn og gir poeng.

Noen tips

Noen funksjoner og annen informasjon som dere kan tenkes ? ha bruk for:

  • lstat (man 2 lstat)
  • isprint (man 3 isprint)
  • snprintf (man 3 snprintf)
  • strncmp (man 3 strncmp)
  • strlen (man 3 strlen)
  • fgets (man 3 fgets)
  • perror (man 3 perror)
  • system (man 3 system)
  • Skjerm I/O for terminaler skjer i Unix gjennom en filabstraksjon. Programmet leser det som brukeren skriver fra stdin eller fildeskriptor 0, og programmet skriver til skjerm enten ved ? skrive til stdout (fildeskriptor 1) eller til stderr (fildeskriptor 2). Det betyr at dere kan bruke de vanlige funksjonene read(), write(), send(), recv(), select(), osv. ogs? for ? lese fra tastatur og skrive til skjerm. Det kan v?re nyttig ? vite.
  • Interaktive klienter vil kunne forandre tilstanden til en TCP socket som de bruker i kommunikasjon med serveren ved ? bruke:
    int activate=1;
    setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &activate, sizeof(int));
  • Servere kan unng? noen sm?problemer ved ? bruke:
    int activate=1;
    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &activate, sizeof(int));
  • For de som skj?nner dokumentasjonen og har lyst ? eksperimentere, ?pner dup2 (se man 2 dup2) noen spennende snarveier.
  • Readv (man 2 readv) og writev (man 2 writev) finnes p? POSIX systemer men f.eks ikke p? Windows. De som liker eksperimenter, kan pr?ve ? unng? en del kopiering ved ? bruke writev istedenfor write og send.

Innlevering - VIKTIG!

Besvarelsen skal best? av den godt kommenterte kildekoden til programmet, makefilen samt en rapport hvor dere svarer p? sp?rsm?lene (og eventuelt beskriver det dere har gjort og begrunner eventuelle valg dere har tatt). Under finner dere instruksjoner p? hvordan dere skal levere inn, og ved ? levere inn oppgaven samtykker dere p? at dere overholder reglene for innleveringen.

Rapport

I forbindelse med de teoretiske sp?rsm?lene (og eventuelt forklaringer i forbindelse med implementasjonen), skal det leveres en rapport. Denne rapporten skal leveres elektronisk som PDF. Bruk punkt 11, enkel linjeavstand og normale marger.

Elektronisk innlevering

Alt skal leveres elektronisk hvor alle filer (Makefile, *.c, *.h, rapport.pdf, etc.) er samlet i én katalog med kandidatnummeret som navn. Av denne katalogen lager dere en komprimert tar-ball – bruk kommandoen tar zcvf knr.tgz knr der knr er kandidatnummeret ditt. Den elektroniske innleveringen skal leveres via Devilry.

N?r skal man levere?

Man m? ha sendt elektronisk versjon – komprimert tarball – F?R kl. 23:59, den 24.11.2014. Merk at denne tidsfristen er HARD, det vil si at oppgaver levert etter fristen betegnes som ?manglende innlevering? og gir automatisk karakteren F (stryk) p? denne oppgaven!

Krav til innleverte oppgaver ved Institutt for informatikk

Emnet INF1060 har en eksamensordning som g?r ut p? at enkelte oppgaver i kurset bed?mmes med karakter som utgj?r en del av den endelige karakteren som gis i kurset (denne oppgaven teller ca. 25%). Derfor skal ALL kode i forbindelse med de karaktergivende oppgavene skrives av studenten selv.

Regler for innlevering og bruk av kode

Ved alle p?lagte innleveringer av oppgaver ved Ifi enten det dreier seg om obligatoriske oppgaver, hjemmeeksamen eller annet forventes det at arbeidet er et resultat av studentens egen innsats. ? utgi andres arbeid for sitt eget er uetisk og kan medf?re sterke reaksjoner fra Ifis side. Derfor gjelder f?lgende:

  1. Deling (b?de i elektronisk- og papirform) eller kopiering av hele eller deler av l?sningen utviklet i forbindelse med de karaktergivende oppgavene i kurset er ikke tillatt.
  2. Deling/distribuering av kode og oppgavetekst med personer som ikke er eksamensmeldt i INF1060 dette semesteret, med unntak av kursledelsen og gruppel?rere, er ikke tillatt.
  3. Hente kode fra annet hold, f.eks. fra andre ``open source'' prosjekter eller kode funnet p? nettet er ikke tillatt.
  4. Det er greit ? f? generelle hint om hvorledes en oppgave kan l?ses, men dette skal eventuelt brukes som grunnlag for egen l?sning og ikke kopieres uendret inn.
  5. Kursledelsen kan innkalle studenter til samtale om deres innlevering.

Samarbeid

Reglene om kopiering betyr ikke at Ifi frar?der 欧洲杯在线买球_欧洲杯投注网站推荐@. Tvert imot, Ifi oppfordrer studentene til ? utveksle faglige erfaringer om det meste. Vi oppfordrer til at studentene skal kunne l?re av hverandre, men, som sagt, man skal ikke dele/distribuere/kopiere noen form for kode i forbindelse med hjemmeeksamen. Det som kreves er som nevnt at man kan st? inne for det som leveres. Hvis du er i tvil om hva som er lovlig 欧洲杯在线买球_欧洲杯投注网站推荐@, kan du kontakte gruppel?rer eller fagl?rer.


Lykke til!
– Tor, Michael og P?l

Publisert 5. nov. 2014 14:15 - Sist endret 5. nov. 2014 15:17