Dette emnet er erstattet av IN3230 – Nettverk.

Ofte spurte spørsmål

Send spørsmål til inf3190-orakel@ifi.uio.no, eller møt til orakeltime.

 

Hjemmeeksamen 1

Hva gjør jeg hvis obligen min er dårlig?

Siden hjemmeeksamen bygger på den obligatoriske oppgaven kan en svak løsning der være en ulempe når man skal gjøre hjemmeeksamen. Vi har derfor bestemt at det skal være mulig å få mer hjelp enn vanlig til å forbedre de delene av hjemmeeksamen som ble levert som en del av obligen (f.eks. konstruksjon av MIP-headere, MIP-ARP, ping-client/server).

Hvis du har fått godkjent obligen, men fremdeles har problemer eller bugs bør du møte opp på en orakeltime for å få fikset disse.

Siden hjemmeeksamen er karaktertellende vil det være mindre hjelp å få til de delene av oppgaven som ikke var en del av den obligatoriske oppgaven.

 

Hva er split horizon?

Split horizon er en forbedring på distansevektor-rutingprotokoller som skal løse count-to-infinity problemet. Kort sagt innebærer dette at du ikke sender informasjon om ruter som går via en maskin til denne maskinen når du sender ut rutingtabellene.

For mer informasjon se forelesningslides eller wikipedia.

Sockets

Skal jeg bruke gethostbyname() eller getaddrinfo()?

gethostbyname() er foreldet (obsolete), og det anbefales at nye programmer bruker getaddrinfo(). Begge alternativer er imidlertid mulig i løsningen din, og gir lik uttelling.

Funksjonene skiller seg ved at getaddrinfo() fungerer for flere adressefamilier enn IPv4, slik som IPv6. Forgjengeren gethostbyname() er derimot begrenset til IPv4-adresser.

Merk at maskinene på ifi per nå ikke har IPv6-forbindelse til Internett. Hvis du ønsker å teste hvorvidt koden din fungerer med IPv6, så kan du bruke SSH-serverne ulrik.uio.no og login.uio.no til dette. Dette er ikke et krav.

Hvordan vet man når en fullstendig ramme er mottatt?

UDP er datagramorientert, og ikke strømorientert slik som TCP. Ett receivekall på en UDP socket kan kun håndtere hele UDP-pakker (datagram). Dette er nærmere presisert på man-siden til udp(7):

All receive operations return only one packet. When the packet is smaller than the passed buffer, only that much data is returned; when it is bigger, the packet is truncated and the MSG_TRUNC flag is set.

Hvis du sender én ramme for hver sendto(), vil du også motta nøyaktig én ramme for hver recvfrom().

Obligatorisk oppgave

Er sendmsg/recvmsg obligatorisk å bruke?

Nei, i utgangspunktet ble det spesifisert i oppgaven at en skulle bruke sendmsg/recvmsg, men dette ble for mange for komplisert. Løsninger med send/recv er dermed også godtatt.

Må jeg bruke QEMU og harddiskfilen som ble gitt ut?

Nei, så lenge du kan kjøre ubuntu med mininet så kan du skrive koden din der. QEMU + harddiskimaget var kun ment for de som er avhengige av å kunne løse oppgaven på Ifis termstuemaskiner.

C-programmering

 

Hvordan fungerer…

En essensiell ressurs i C-programmering er de såkalte man-sidene. Du behøver neppe pugge disse, men bruk gjerne tid på å lære deg å lese man-sider. De har som regel alt du trenger å vite om en funksjon – en kort beskrivelse, parametre, returverdi og evt. hensyn man bør ta.

For å finne man-siden til funksjonen getaddrinfo, kan du kjøre følgende kommando i et shell: man getaddrinfo. Merk for øvrig at man-sidene finnes på Internett, se lenke til høyre.

Hvordan bør jeg skrive ut debuginformasjon?

Når du kompilerer koden med make debug vil gcc bli kjørt med opsjonen -DDEBUG. Dette kan du bruke til å kun printe debugoutput hvis programmet blir kompilert med make debug.

Her er et eksempel på en makro DPRINT() som fungerer som printf(), som også vil skrive ut filnavn og linjenummer, men ikke skrive ut noe hvis du kompilerer uten -DDEBUG.

#ifdef DEBUG
#define DPRINT(args...) fprintf(stderr,"%10s:%-3d - ", __FILE__, __LINE__); fprintf(stderr, args);
#else
#define DPRINT(args...)
#endif

Merk at du kan utvide en slik makro med tilleggsinformasjon etter behov. Se feks. en debugmakro som har tidspunkt med på utskriften.

Programmet mitt segfaulter?!
  • Sørg for at du kompilerer med flagget -g til gcc, hvis du ikke gjør dette så vil ikke debuggingsinformasjon bli lagt ved.
  • Kjør programmet ditt med gdb. Hvis du vanligvis ville kjørt ./main 1234 1, så gjør dette: gdb ./main, og når gdb har startet opp skriver du run 1234 1
  • Når programmet ditt da segfaulter, skriv bt full, da vil du se alle funksjonskallene (og argumentene til disse) som ledet opp til kræsjet, hvis du kun får opp spørsmålstegn så har du ødelagt stakken, da har du mest sannsynlig skrevet for mye til en variabel av typen char a[100];.

Terminologi

Norsk Engelsk  
Ramme Frame Overføres på lag 2
Pakke Packet Overføres på lag 3
  Payload Lasten fra/til laget over. (Typisk det som er igjen når header tas vekk.)

 

Publisert 5. mars 2015 14:11 - Sist endret 9. mars 2015 01:26