delphi – 如何确定Indy的连接是否仍然存在?

delphi – 如何确定Indy的连接是否仍然存在?,第1张

概述我使用Indy进行TCP通信(D2009,Indy 10). 在评估客户端请求后,我想将答案发送给客户端.因此我存储TIdContext,就像这样(伪代码) procedure ConnectionManager.OnIncomingRequest (Context : TIdContext);begin Task := TTask.Create; Task.Context := Con 我使用Indy进行TCP通信(D2009,Indy 10).

在评估客户端请求后,我想将答案发送给客户端.因此我存储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,而是使用TIDTcpserver提供的上下文列表:

procedure ThreadPool.Execute (Task : TTask);var  ContextList : TList;  Context : TIDContext;  FoundContext : Boolean;begin  // Perform some computation  FoundContext := False;  ContextList := FIDTcpserver.Contexts.LockList;  try    for I := 0 to ContextList.Count-1 do      begin      Context := TObject (ContextList [I]) as TIDContext;      if (Context.Connection.socket.Binding.PeerIP = Task.ClIEntInfo.IP) and         (Context.Connection.socket.Binding.PeerPort = Task.ClIEntInfo.Port) then        begin        FoundContext := True;        Break;        end;      end;  finally    FIDTcpserver.Contexts.UnlockList;  end;  if not FoundContext then    Exit;  // Context is a valID connection,send the answerend;

这对我行得通.

总结

以上是内存溢出为你收集整理的delphi – 如何确定Indy的连接是否仍然存在?全部内容,希望文章能够帮你解决delphi – 如何确定Indy的连接是否仍然存在?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1258609.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存