我正在使用TIdTCPCmdServer来处理与客户端应用程序的全部通讯。 我但愿个人服务器记录全部类型的东西,包括网络流量。 有没有简单或聪明的方法来查看TCPCmdServer实际收到和发送了多少字节? 我只能想到代码 html
ASender.SendReply; Inc (FTraffic, Sizeof (ASender.NormalReply.Code) + Sizeof (Char) * ASender.NormalReply.Text.Length));
这在我看来很是难看,由于这些流量更新会在个人代码中传播,而且至关复杂。 服务器
有什么建议? 网络
谢谢你的帮助。 ide
将TCPCmdServer
包装到记录流量的类中。 spa
您能够从TCPCmdServer派生您的类,并覆盖发送和接收方法(若是它们是虚拟的)。 日志
就像是: code
type TTcpCmdServerWithLogging = class(TTcpCmdServer) ... procedure SendReply; override; implementation procedure SendReply; begin inherited SendReply; Inc (FTraffic, Sizeof (NormalReply.Code) + Sizeof (Char) * NormalReply.Text.Length)); end;
若是它们不是虚拟的,则建立实例化TCPCmdServer并公开所需方法和属性的新类。 orm
查看Indy的拦截类。 您应该可以建立一个自定义拦截类来覆盖Receive()和Send()方法,而且除了调用基类的方法以外,还能够实现流量计算。 已经有拦截类来进行日志记录,您能够以相同的方式链接自定义类。 htm
TIdConnectionIntercept的文档应该是一个很好的起点。 还有一个很简单的例子, 在这里就如何建立并在运行时链接拦截。 文档
很是感谢你的回答。 我选择以mghie描述的方式实现它 - 经过为个人链接实现自定义拦截器类。 对于那些对解决方案感兴趣的人,我将在这里提供一些源代码:
type TCountTrafficInterceptor = class (TIdConnectionIntercept) public type TIntPointer = ^Longint; private FTraffic : TIntPointer; public constructor Create (TrafficVar : TIntPointer); procedure Send (var ABuffer : TIdBytes); override; procedure Receive (var ABuffer : TIdBytes); override; end; constructor TCountTrafficInterceptor.Create (TrafficVar : TIntPointer); begin FTraffic := TrafficVar; end; procedure TCountTrafficInterceptor.Send (var ABuffer : TIdBytes); begin inherited Send (ABuffer); FTraffic^ := FTraffic^ + Length (ABuffer); end; procedure TCountTrafficInterceptor.Receive (var ABuffer : TIdBytes); begin inherited Receive (ABuffer); FTraffic^ := FTraffic^ + Length (ABuffer); end;
在TIdTCPCmdServer的OnConnect方法中:
AContext.Connection.IOHandler.Intercept := TCountTrafficInterceptor.Create (@FNetworkTraffic);
效果很好,只是我正在寻找的那种解决方案。 再次感谢您的回答。
顺便说一句:我如何在帖子中使用(at)标志? 当我尝试输入时,我老是获得一个块引用...