Hola,
Bueno, veo que nadie sabe nada, o a nadie le interesa. De todas formas, por si en algún momento le lelga a servir a alguien, les cuento la solución que encontre:
Se trata de una solución indirecta; es decir, no pude determinar la causa específica y por ende no está resuelto como debería ser. En su lugar, lo que hago es una solución práctica : Reinicializar el software de comunicaciones en el equipo cliente:
La estructura del código Delphi es algo como esto:
Código Delphi
[-] Intentos := 0;
Repeat
ItsOk := False;
Try
MyIdHTTP.Post(....);
ItsOk := True;
Except
....
...
On E:EIdSocketError Do Begin
....
..
Inc(Intentos);
if E.LastError = 10054 then Begin
RemoveComponent(MyIdHTTP);
MyIdHTTP.Free;
MyIdHTTP := Nil;
MyIdHTTP := TIdHTTP.Create(Self);
End;
End;
...
,,
End;
Until (Intentos > 4) Or ItsOk;
Aquí, el truco es que atrapar primero el error 10054, lo que se hace atrapando su clase de error EIdSocketError, y luego preguntado si es el 10054.
Luego, se debe liberar el componente TIdHTTP y volver a crearlo. Aquí, el truco es usar primero RemoveComponent porque nuestro Componente está en un TDataModule, luego hay que extraerlo de ahí, antes de liberarlo con el free.
Lo del "MyIdHTTP := Nil;" no es realmente necesario dado que se reasigna enseguida; pero yo lo uso por metodología, ya que en general, al liberar memoria se debe uno asegurar que realmente quede en Nil el pointer.
No sobra comentar que en una versión de prueba le había puesto un ShowMessage que, cada vez que atrapaba al 10054, me avisaba que se había producido, así pude darme cuenta que con el truco explicado, el sistema sigue trabajando bien después de presentarse el error.