FAQ - Oblig 1

Her har du svar på noen spørsmål du kanskje har. Er det andre ting du lurer på, kan du sende mail til inf3190-orakel {at} ifi.uio.no

Q: Skal jeg levere både del 1 og del 2?
A: Hvis du vil, men det holder å levere del 2. Oppdelingen er bare for å hjelpe dere å komme i gang. Det er veldig lite i del 1 som ikke brukes i del 2, men du trenger dermed ikke implementere del 1 fullt ut hvis du med en gang skjønner hvordan du skal få til del 2.

Q: Jeg trenger hjelp, hva gjør jeg?
A: Først leser du dette. Deretter kan du sende en mail til orakel, samt møte opp på orakeltimer.

Q: Jeg sliter med å forstå hvor jeg skal begynne?
A: Det er mye å sette seg inn i fra første stund. Derimot trenger man ikke gape over alt på en gang. Det kan være lurt å begynne med det enkleste først, som å forstå hvordan man skal få satt opp en forbindelse mellom to maskiner. Hvis du ikke husker noe om dette kan det være lurt å se på noen av foilene fra inf1060, hvor dette forklares grundig. Der finner du også skjelett-kode en server og klient som du kan bruke som utgangspunkt. 

Q: Hvordan bruker jeg Berkeley Sockets?
A: I tillegg til materiell fra inf1060, står det blant annet en meget bra artikkel på wikipedia, og det finnes en veldig bra guide kalt Beej's guide to network programming.

Q: Hva betyr - error: dereferencing pointer to incomplete type?
A: Det betyr somregel at du prøver og bruke en struct, men har glemt og definere den. Husk alltid å include de korrekte headerfilene.

Q: Hvordan sammenligner jeg strukter?
A: Du må sammenligne hvert element i struktene, hver for seg.

Q: Hvordan sender jeg en struct over socketen?
A: En struct er egentlig bare en samling av byte på rekke og rad, derfor går det fint å caste om structen til en (char *) som peker på structen. Og du kan da caste om andre veien på motsatt side når du mottar den. Derimot kan structen behandles ulikt på ulike maskiner. Dette grunnet f.eks alignment, endianess etc. Siden vi i denne obligen bruker kun ifi sine maskiner så vil det fungere, men det er noe å tenke over.

Q: Hvilke port-numre skal jeg bruke?
A: Det velger du selv. Merk imidertid at du normalt må bruke porter over 1024, da de lavere portene er reservert for systemtjenester og bare kan tas i bruk av brukere med økte privilegier.

Q: sockaddr_in som jeg får fra recvfrom() fylles inn med gale verdier
A: Dette er som regel på grunn av at addrlen-feltet (siste parameter til recvfrom) ikke er initialisert riktig. addrlen må være en peker til en socklen_t, initialisert til størrelsen på en sockaddr_in.

eksempel:

    socklen_t addrlen = sizeof(struct sockaddr_in);
  
    /* ... */

    int len = recvfrom(my_udp_socket, buf, sizeof buf, 0,
            (struct sockaddr *) &fromaddr, &addrlen);


Q: Hvordan skal jeg få tak i utskriften fra et program jeg starter fra programmet mitt?
A: Du bruker typisk pipes. Se fork(), exec(), pipe(), system(), popen() m.fl. Les også denne og titt på denne.

Q: Er det meningen at serveren skal kunne behandle forespørsler fra multiple klienter samtidig?
A: Ja. Oppgaven sier at du må bruke f.eks fork() for å behandle flere tilkoblinger/handlinger på serveren samtidig.

Q: Får en flere forsøk på å levere den obligatoriske oppgaven?
A: Se administrativ FAQ.

Q: Hjelp, jeg rekker ikke bli ferdig innen tidsfristen på den obligatoriske oppgaven. Kan jeg få utsettelse?
A: Se administrativ FAQ.