Ofte spurte sp?rsm?l

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

 

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 23. feb. 2016 09:49 - Sist endret 23. feb. 2016 09:50