30. marts 2002 - 11:57Der 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.
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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 :-)
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?
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...
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 :-)
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 )
Synes godt om
Ny brugerNybegynder
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.