Avatar billede the-gnu.dk Nybegynder
09. januar 2007 - 11:08 Der er 4 kommentarer

Socket Poll funktion

Jeg har et serverprogram, som har en masse sockets til forskellige klienter.

Jeg vil gerne finde ud af, hvornår en klient disconnecter, og bruger derfor en timer, som udfører følgende:

            if(this.socket.Poll(500, SelectMode.SelectRead)) {
                StopSocketStateTimer();
                running = false;
                this.socket.Close();
            }

Problemet er, at Poll (tror jeg) skriver nogle bytes vha. socket.write();, MEN hvis jeg samtidig er i gang med at skrive bytes til klienten via NetworkStream, trangsafbryder den forbindelsen.

Jeg har prøvet med en lock(this) { } på Poll og den anden Write, men uden held.

Nogen der har en løsning på ovenstående problemstilling, eller en anden metode til at finde ud af, om en socket stadig er aktiv?
Avatar billede md_craig Nybegynder
09. januar 2007 - 12:54 #1
UDP eller TCP ?

hvis TCP og du kan sende uden exceptions, så er din socket jo per definition aktiv. og så lad være med at polle så længe det er tilfælde.

hvis UDP implementer det således at du kan stop/pause -> Poll -> Start/Fortsæt...

Men en anden ting, hvis din klient disconnecter på en "forkert" måde, fx at programmet går uvilligt ned... så kan du ifl. dokumentationen ikke bruge Poll.

This method cannot detect certain kinds of connection problems, such as a broken network cable, or that the remote host was shut down ungracefully. You must attempt to send or receive data to detect these kinds of errors.
Avatar billede the-gnu.dk Nybegynder
09. januar 2007 - 14:05 #2
Okay, så må jeg jo sætte min timer til at sende et ping vha. NetworkStream jævnligt. Kan bare ikke forstå, at der ikke er en smartere metode!
Avatar billede the-gnu.dk Nybegynder
09. januar 2007 - 14:05 #3
TCP
Avatar billede md_craig Nybegynder
09. januar 2007 - 14:23 #4
Ja altså når det så er TCP, så behøber du kun Pinge når du ikke bruger din socket, for i andre tilfælde så er den aktiv. og hvis klienten skulle afslutte uventet, så vil du få en exception i og med det er Connection Oriented.

Når du så bare har en Idle Connection, så er det simpelthen at lave en form for ping pakke, denne skal clienten jo så forstå således at den kan smide den ud.

Og det er IMO det nemmeste at gøre, for selv om du måske kan få at vide at clienten er disconected via Poll hvis det sker ordenligt på hans side. så vil fejl scenarierne bare kræve at man stadig gør det andet. (Ifl dokummentationen hvertfald)...

Det næste spørgsmål er så hvad der sker når en Klient lukker ordenligt ned, så vil man stadig få en exception når man vil sende, men spørgsmålet er om den er sigende nok til at sige om det var grundet en netværksfejl/programfejl. eller om klienten disconnectede rigtigt. (det vil jo være rart at kunne fortælle at en klient Disconnectede "lovligt", eller om han bare pluselig forsvandt)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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