Gå til innhold

[LØST] (POSIX) Nettverksprogrammering, close() stopper ikke tilkoblingen med en gang


Anbefalte innlegg

Hei. Har et lite problem med nettverksprogrammering. Jeg sender lyd over nettverket, som blir spilt av hos serveren. Et litt plagsomt problem er at når jeg eventuelt velger å avslutte klienten med SIGINT eller rett og slett close(), klarer serveren fortsatt å lese omlag 2 sekunder med lyddata før

recv() på serversiden returnerer 0. I noen tilfeller har det tatt opp til 7-8 sek fra close() til recv() == 0. Det tyder jo på at jeg får lagret opp en stor buffer "behind the scenes" siden jeg prøver å sende lyd så fort som det er mulig til serveren, men at serveren ikke merker at jeg faktisk har kjørt close(). Er det en enkel måte å unngå dette på? En løsning kunne ha vært å cappe hvor stor nettverksbufferen var for den enkelte socketen. Noen ti-dels sekunder latency mellom close() og recv() == 0 er ikke noe problem.

Koden jeg bruker er noe ala dette:

Begge socketene er ikke satt til non-blocking.

 

Klient:

for(;;)
{
 read(STDIN, buffer, size);
 send(socket, buffer, size, 0);
}

 

Server:

for(;;)
{
 recv(socket, buffer, size, 0);
 play_audio(buffer, size);
}

 

EDIT: Nei, skulle du ha sett hva setsockopt() kunne gjøre ...

Endret av TheMaister
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...