FAQ Nettverksprogrammering

Fra mn/ifi/INF1060
Revisjon per 13. nov. 2010 kl. 04:55 av Bendiko@uio.no (diskusjon | bidrag) (Ny side: == Hvordan bruker jeg Berkeley Sockets? == Det står en meget bra artikkel på [http://en.wikipedia.org/wiki/Berkeley_sockets wikipedia]. == cannot bind to socket: address already in use?…)

(diff) ← Eldre revisjon | Nåværende revisjon (diff) | Nyere revisjon → (diff)
Hopp til: navigasjon, søk

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 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.