Avatar billede stringbuffer Nybegynder
30. marts 2002 - 11:57 Der er 8 kommentarer og
2 løsninger

CGI - tjek om browser er forbundet

Jeg har et CGI-program som skal bruges til en chat. Den tjekker for nye beskeder fra noget delt hukommelse og sender dem til browseren. Da dette program kører med en uendelig løkke, vil jeg gerne have en måde at bryde ud af den på, hvis brugeren har lukket browseren eller mistet forbindelsen.

Jeg har prøvet at lave en select() hvor jeg tjekker for om stdout bliver skrivbar, men det virker ikke - programmet fortsætter med at køre indtil serveren skønner at der er noget galt og nakker det (ca. ½ minut efter)

Et par linier kode, der viser hvad der skal gøres, ønskes som svar.
Avatar billede brilleaben Nybegynder
30. marts 2002 - 16:07 #1
Heh - det kan du ikke.  HTTP er en stateless/one-shot protokol.  Dvs. at alle forespørgelser sker som:

connect
send request
read response
close
Avatar billede brilleaben Nybegynder
30. marts 2002 - 16:08 #2
Man hvorfor ikke sætte en alarm op før din løkke & så exit'e i alarm handleren?
Avatar billede stringbuffer Nybegynder
30. marts 2002 - 16:39 #3
Vis mig hvordan
Avatar billede brilleaben Nybegynder
30. marts 2002 - 16:48 #4
Easy peasy:

et eller andet sted i dit c-program har du følgende funktion:

void alarmHandler(int signal)
{
    fprintf(stderr, "Byebye on %i\n", signal");
    exit(0);
}

Før din løkke hvor du gør hvad dit CGI program nu engang gør skal du sætte:

signal(SIGALRM, alarmHandler);
alarm(30);  /* antal sekunder inden alarmen går af */

Hvis din løkke terminerer _normalt_ skal du huske at resette alarmen med:

alarm(0);


Alle steder hvor du bruger 'read' & 'write' skal du checke efter en EINTR - det betyder, at alarmen har 'lydt' mens du stod i det pågældende systemkald.  Du kan blot terminere/returnere (eller hvad der skal gøres når tiden er løbet :-)
Avatar billede stringbuffer Nybegynder
01. april 2002 - 09:29 #5
Er det ikke noget med at en process, der har forket en anden process, sender en eller anden signal til den forkede process når den selv bliver termineret?
Avatar billede stringbuffer Nybegynder
01. april 2002 - 09:29 #6
Tænkte på at man måske kunne handle dette signal istedet...
Avatar billede brilleaben Nybegynder
01. april 2002 - 09:49 #7
Nej - du tænker på, at child processen sender SIGCHLD til parent processen når child'en 'dør'.    Du kan, i parent processen, vælge at ignorere dette.
Avatar billede stringbuffer Nybegynder
01. april 2002 - 09:59 #8
Surt...
Nåh, jeg tror at jeg vælger at gøre det på en anden måde: lave min egen server. Apache er desværre lidt for klodset til den slags anvendelser. Selvom det kørte fint nok med mit omtalte CGI-program og chunked transfer encoding (browseren forblev forbundet og der kom nye linier når CGI-programmet fandt nye linier). Hvis det virkede med CGI vil det nok også virke med en custom server.
Men idéen virker altså, så selv om du siger at HTTP er en one-shot response-reply protokol, så er der intet i vejen for at du bliver ved med at sende din response i uendelighed (en chunk ad gangen), IE blev i hvert fald ved med at læse den response i mange timer indtil jeg til sidst selv slukkede for den...
Avatar billede brilleaben Nybegynder
01. april 2002 - 10:06 #9
Det er klart at hvis du streamer data - men så kan/skal du parre din 'write' løkke med alarm - det virker uden problemer.  Har skrevet en SMTP server der brugte denne metode.    Held og lykke med projektet :-)
Avatar billede stringbuffer Nybegynder
02. april 2002 - 14:08 #10
Takker :)

Har allerede lavet en lille server, der bruger select() i en dispatcher-løkke og en mængde tråde, der udfører klienternes forespørgsler og en tråd, der sender nye data ud til alle.

Foreløbigt er der ingen HTTP i det, det virker dog fint med telnet :)

. o O ( måske skulle man bare lave en Java-klient, der både skriver og læser linier til/fra chatten )
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester