Forskjell mellom versjoner av «FAQ Hjemmeeksamen 2»

Fra mn/ifi/INF1060
Hopp til: navigasjon, søk
(Datastruktur for lagring av meldinger)
(Hvordan bruker jeg Berkeley Sockets?)
Linje 24: Linje 24:
 
== Hvordan bruker jeg Berkeley Sockets? ==
 
== Hvordan bruker jeg Berkeley Sockets? ==
  
Det står en meget bra artikkel på wikipedia.
+
Det står en meget bra artikkel på [http://en.wikipedia.org/wiki/Berkeley_sockets wikipedia].
  
 
== cannot bind to socket: address already in use? ==
 
== cannot bind to socket: address already in use? ==

Revisjonen fra 13. nov. 2010 kl. 04:50

Må jeg gjøre alt fra hjemmeeksamen 1 i innleveringen av hjemmeeksamen 2?

Nei, det er ikke nødvendig. Det eneste som er nødvendig å gjøre i hjemmeeksamen 2 er det som er spesifisert i oppgaveteksten for hjemmeeksamen 2.

Prompt og innlesning

Her kan du sannsynligvis bruke mye av koden fra hjemmeeksamen 1, så lenge det er i henhold til oppgaveteksten i hjemmeeksamen 2.

Datastruktur for lagring av meldinger

Hva slags struktur du bruker for å lagre meldingene er opp til deg. Hvis koden fra hjemmeeksamen 1 fungerte kan du bruke den, hvis ikke må du gjerne lage en enklere løsning.

I hjemmeeksamen 2 er det ikke nødvendig å:

  • ha ett kontinuerlig minne for dataene
  • bruke bitmap eller bytemap
  • dele opp meldingene i datablokker

Det blir altså ikke gitt ekstrapoeng for slike løsninger.

SMS-serveren skal kunne håndtere flere innkommende meldinger samt multiple telefoner

Serveren skal kunne håndtere flere tilkoblinger på en gang; den skal altså kunne lytte på alle socketer og håndtere data som kommer fra klientene.

Hvordan bruker jeg Berkeley Sockets?

Det står en meget bra artikkel på wikipedia.

cannot bind to socket: address already in use?

Dette kan skje hvis du avslutter server/klient og starter opp igjen med en gang. Når du kjører bind vil porten være bundet til en socket, og vil da ikke være mulig å binde den samme porten på nytt. Når du avslutter programmet vil socketen havne i TIME_WAIT-tilstand, og porten vil ikke kunne brukes igjen før denne timeouten er ferdig.

Ved å bruke flagget SO_REUSEADDR vil det likevel være mulig å bruke en port som er bundet til en socket i TIME_WAIT-tilstand.

Legg til følgende i koden på egnet sted (før bind-kallet):

int activate = 1; setsockopt(your_socket, SOL_SOCKET, SO_REUSEADDR, &activate, sizeof(int));

Kan dere fortelle mer om Select()?

Her er en forklaring på select, se ellers man select i terminalen. Sjekk også Beej's guide to network programming. Kan jeg anta at read og write leser og skriver det jeg håper de vil?

Det er ingen garanti for hvor mange byte read og write leser og skriver. read vil aldri lese mer enn det som oppgis i count, men den kan godt lese mindre. Det samme gjelder write; den vil aldri skrive mer enn count, men den kan skrive mindre. Det kan være ulike grunner til at de gjør nettopp det, og det er ingen god idé å anta at de ikke gjør det. Når du kaller write to ganger, er det ingen måte å skille mellom dataene fra disse to kallene på andre siden. To kall på write (på samme socket) rett etter hverandre som skriver 10 byte hver, vil sannsynligvis leses som 20 byte på andre siden. Det er dette applikasjonslagsprotokollen skal løse; hvordan skille mellom ulike meldinger.

Hvordan fanger jeg signalet fra CTRL-C?

se man signal

Hva er en ACK, og når skal det brukes?

ACK er en kortversjon av ACKnowledge og betyr bekreftelse. Når en melding sendes, skal det sendes en ACK-melding tilbake som bekrefter at denne (unike) meldingen har blitt mottatt. Både server og klient (mobil) skal sende ACK på meldinger som mottas.

Applikasjonslagsprotokoll, hva er det?

I hjemmeeksamen 2 skal data sendes via et nettverk ved hjelp av TCP/IP, mellom klienter (mobil) og en server. TCP er en pålitelig protokoll som garanterer at dataene som sendes kommer fram på andre siden i eksakt samme form og rekkefølge. TCP kan dog ikke fortelle programmet ditt hva dataene betyr; det er bare bits. Derfor er det nødvendig med en applikasjonslagsprotokoll som definerer rammene rundt hva dataene som kommer på socketen faktisk betyr. Denne protokollen skal forklares og begrunnes i rapporten, så enkelt og konkret som mulig.

Skal jeg teste på en egen server, og hvordan gjøres det?

Det fungerer fint å kjøre både klient (mobil) og server på den lokale maskinen, men det kan være greit å teste serveren på en av Ifi-serverne. Logg inn på login-maskinene slik: ssh login.ifi.uio.no og kjør server-programmet ditt derfra.

Meldings-ID; lokal eller global?

Det var opprinnelig tenkt at alle IDer som klientene (mobilene) lager skulle være globalt unike. Dette ble endret slik at det ikke lenger er et krav. IDene skal altså kun være unike lokalt for hver mobil/server.

Sende en melding til flere mobiler?

Kommandoen send skal kunne sende en melding til flere telefonnumre. send 11111111 22222222 33333333 1555 skal sende melding (ID 1555) til de tre numrene 11111111, 22222222 og 33333333. En enkel løsning vil være å sende meldingene tre ganger, med tre ulike destinasjons-telefonnumre. Dette er en løsning som vil noe poeng. En løsning som gir full uttelling er hvis man bruker multicast. Det vil si at meldingen sendes en gang til serveren, og serveren videresender meldingen til de telefonene som er oppført i "TO-feltet".

Ubegrenset kø-lengden på serveren, må jeg da skrive til disk hvis minnet er fullt?

Når det i oppgaven beskrives at en løsning som gir ubegrenset antall meldinger i køen gir mer poeng, refererer det til implementasjonen, dvs. at løsningen ikke har en begrensning, med f.eks. et array på N plasser. Det er ikke nødvendig å skrive meldinger til disk hvis minnet er fullt.