Indy를 TCP 통신 (D2009, Indy 10)으로 사용합니다.연결이 Indy에서 아직 살아 있는지 확인하려면 어떻게합니까?
클라이언트 요청을 평가 한 후 클라이언트에 응답을 보내려고합니다. 그래서 저는 TIdContext 같은이 (의사)를 저장
procedure ConnectionManager.OnIncomingRequest (Context : TIdContext);
begin
Task := TTask.Create;
Task.Context := Context;
ThreadPool.AddTask (Task);
end;
procedure ThreadPool.Execute (Task : TTask);
begin
// Perform some computation
Context.Connection.IOHandler.Write ('Response');
end;
그러나 클라이언트가 요청 및 전송에 대한 준비가되는 답 사이의 어딘가에 연결을 종료하는 경우? 컨텍스트가 유효한지 어떻게 확인할 수 있습니까? 시도 :
if Assigned (Context) and Assigned (Context.Connection) and Context.Connection.Connected then
Context.Connection.IOHandler.Write ('Response');
그러나 도움이되지 않습니다. 어떤 경우에는 프로그램이 멈추고 실행을 일시 중지하면 현재 행이 if 조건을 가진 행이라는 것을 알 수 있습니다.
여기서 어떻게됩니까? 연결이 끊어진 상태로 보내려고하지 않으려면 어떻게해야합니까?
문제는 TIdContext 및 연결에 액세스하면 응용 프로그램이 중단되고 테스트 연결 메시지가 아무런 차이가 없다는 것입니다. – jpfollenius
시간 초과를 기다리고 있기 때문에 정지합니까? –
인디 (Indy)가 너무 막혀서 앱이 멈춰있는 이유입니다. 클라이언트가 여전히 살아 있는지 확인하는 가장 좋은 방법은 클라이언트 "상태 메시지"를 수신하는 것입니다. 고객은 일정한 간격으로 체크인해야합니다. 클라이언트가 이러한 검사를 많이 수행하지 못하면 사용할 수없는 것으로 간주 할 수 있습니다. 또는 비 블로킹 라이브러리 (ICS)를 사용할 수 있으므로 응용 프로그램이 TCP 연결을 차단하지 않습니다. 연결을 기다리는 것이 앱이 응답하지 않는다는 의미는 아닙니다. 비 블로킹 소켓이나 스레드를 사용하십시오. – Runner