![]() |
Sockets: no recibo el read despues del connect
Hola amigos, Feliz año para todos.
Hace ya algunos meses que estoy con este problema y no puedo encontrar el motivo. Tengo un programa servidor usando TServerSocket (Delphi 7), a este servidor acceden varios puestos con TClientSocket. Despues de un par de dias en funcionamiento, los clientes empiezan a no poder conectarse, mirando el log que genera el servidor, puedo ver que se recive el evento de conexion y detras deberia recibirse el evento Read del socket pero nunca llega y mientras tanto los clientes que ya estan conectados siguen funcionando sin problemas haciendo consultas (read) pero los nuevos intentos de conexion no se producen hasta que se reinicia el servidor. Si alguien tiene alguna idea de que puede provocar que no se reciba el evento Read del socket me seria de gran ayuda. Gracias |
TJvTimer no libera el thread
Hola amigos.
En un programa que actua como servidor tcp usando TServerSocket con Delphi 7 lo que hago es lo siguiente. Cuando alguien se conecta al puerto se dispara el evento OnConnect del socket, alli creo una instancia de una clase derivada de TJvTimer a la que le asigno el socket que se acaba de conectar y si al cabo de 1 segundo no recibo en el evento read del socket la firma del cliente se dispara el evento OnTimer y hace un close del socket y el free de la clase. Viene funcionando varios dias pero en un momento que puede ser despues de 1 semana o algunas horas, ningun cliente se puede conectar y mirando el taskmanager se puede ver que se empiezan a incrementar las hebras del programa hasta que termina reventando. El MadException me tira una chirrera de este bloque: thread $1fe70 (TJvTimerThread): <priority:2> 7c82860c ntdll.dll KiFastSystemCallRet 7c827d27 ntdll.dll NtWaitForSingleObject 77e31d18 kernel32.dll WaitForSingleObjectEx 77e31c88 kernel32.dll WaitForSingleObject 0044e7b4 acdsrv.exe Classes TThread.WaitFor 0044e3ed acdsrv.exe Classes TThread.Destroy 005d495a acdsrv.exe JvTimer TJvTimerThread.Destroy 004046f0 acdsrv.exe System TObject.Free 005d4ba6 acdsrv.exe JvTimer TJvTimer.Destroy 004046f0 acdsrv.exe System TObject.Free 006496b6 acdsrv.exe Main 1183 TNewSocket.TimerEvent 005d4dd6 acdsrv.exe JvTimer TJvTimer.Timer 005d4a4c acdsrv.exe JvTimer TJvTimerThread.Execute 0042ad06 acdsrv.exe madExcept HookedTThreadExecute 0044e27c acdsrv.exe Classes ThreadProc 004055dc acdsrv.exe System ThreadWrapper 0042ac9b acdsrv.exe madExcept ThreadExceptFrame >> created by main thread ($1f91c) at: 005d48b9 acdsrv.exe JvTimer TJvTimerThread.Create Se puede ver que no se estan liberando los threads. No tengo idea de cual es el disparador pero justo cuando no se pueden conectar es que se ve que empiezan acrecer los threads. Puede ser que por algun motivo se esten perdiendo mensajes de la cola de mensajes? Alguien tiene alguna idea. Los sockets son non blocking y pasa tanto en windows Server 2003 como 2008. Gracias. |
El componente TJvThreadTimer tiene la propiedad KeepAlive que hace que no se liberen los threads..
|
La franja horaria es GMT +2. Ahora son las 13:01:06. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi