Avatar billede kroning Nybegynder
29. november 2008 - 18:41 Der er 8 kommentarer og
1 løsning

Indy TIdTCPServer og TIdTCPClient

Måske har dette ikke noget med Delphi at gøre men man har jo efterhånden lært ikke at udelukke noget.
Jeg bruger Delphi 7 og Indy 10.2.3

Jeg har en server (TIdTCPServer) og ca. 30 klienter (TIdTCPClient) som forbinder til min server via internet.

Klienterne har ikke en konstant forbindelse til min server men opretter en forbindelse hver gang de vil noget og lukker derefter ned igen. Dette gør hver klient flere hundrede gange hver dag.

Det hele virker fint men der er lige nogle enkelte bestemte klienter som daglig får 1-2 fejl. Fejlene er altid:
Connect timed out. eller Read timed out.

Jeg har lavet det således at klienterne forsøger 3 gange inden de melder fejl og jeg har sat ReadTimeout:=15000; og ConnectTimeout:=10000;

Nogle ideer?
Avatar billede psycosoft-funware Nybegynder
29. november 2008 - 18:52 #1
har du set efter et mønster når det er at nogle af klienterne få en timeout besked? fx på bestemte tidspunkter?

./psycosoft-funware :)
Avatar billede kroning Nybegynder
29. november 2008 - 19:03 #2
Næ jeg har ikke lagt mærke til tidspunkter men det vil jeg prøve nu.
Avatar billede hrc Mester
29. november 2008 - 21:34 #3
I fortsættelse af psykos forslag. Kan du ikke logge hver connectiontråd (med timestamp, klient-ip og svarlængde)?
Avatar billede kroning Nybegynder
30. november 2008 - 00:24 #4
Jeg logger alt, men ved "Connect timed out" er der naturligvis ikke noget at logge.
Jeg har netop send en ny klient version ud som sender mere detaljeret oplysninger tilbage til mig mht. hvor fejlen opstår. Jeg har lavet det således at der sendes en mail til mig hvis der opstår en fejl, grunden til denne mail er at åbenbart ingen brugere læser hvad der står på skærmen når der kommer en fejl besked frem.

I øjeblikket tror jeg dog mest på at det er hos klienterne det halter, altså dårlig udstyr eller forbindelse.

Jeg kan nævne en bestemt klient som fik masser af fejl hver dag men efter de så skiftede noget net udstyr (vist nok et netkort) så har de siden ikke haft en eneste fejl.

En anden mærkelig ting er at en bestemt klient mange gange i løbet af en dag skaber en exception i mit server program med fejl teksten "Connection reset by peer", men bortset fra det så virker alt som det skal hos denne klient.

Spørgsmålet er om det jeg har lavet med ReadTimeout:=15000;, ConnectTimeout:=10000; og 3 forsøg er nok til at tage højde for ustabile forbindelser.
Avatar billede hrc Mester
30. november 2008 - 20:02 #5
Defekte netkort er en plage. Vi havde engang en mindre sygehuskunde der var ved at forlade kundeflokken ... indtil vi betalte en ekspert til at måle deres netværk igennem. Mener det var ét defekt netkort der var skyld i ventetider og datatab. Røvsvært at identificere.

Hvis du kan sætte fingeren på en bestemt klient er det nok værd at lege lidt med netkort (eller drivere).
Avatar billede kroning Nybegynder
04. december 2008 - 20:06 #6
Nu er der ikke kommet en eneste fejl siden den 30/11 så måske er det gået over helt af sig selv?
Smid venligst nogle svar :-)
Avatar billede hrc Mester
05. december 2008 - 13:05 #7
Jeg har ikke hjulpet noget, så nej tak. Blev der kontrolleret noget med netkortene?
Avatar billede kroning Nybegynder
05. december 2008 - 17:57 #8
Så kom der en fejl, dog fra en der ikke tidligere er kommet fejl fra.
Fejlen er: Read timed out

Koden er, en del forkortet:

Klienten sender noget til serveren og venter så på svar:
IdTCPClient.IOHandler.WriteLn(Post.CommaText);
Svar.CommaText:=IdTCPClient.IOHandler.ReadLn;
Stream:=TMemoryStream.Create;
IdTCPClient.IOHandler.ReadStream(Stream,-1,false); //fejler her


Server modtager og svarer:
Request.CommaText:=AContext.Connection.IOHandler.ReadLn;
AContext.Connection.IOHandler.WriteLn(Result.CommaText);
.. opretter stream og sender til klient
AContext.Connection.IOHandler.Write(Stream, 0, true);

Fejlen opstår i linien "IdTCPClient.IOHandler.ReadStream(Stream,-1,false);" hos klienten.
Avatar billede kroning Nybegynder
05. januar 2009 - 17:33 #9
Så lukker jeg.

Jeg pakker det hele ind i en try-except, nedsætter connect- og readtimeout og lader klienten forsøge 3 gange.
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