草庐IT

delphi-units

全部标签

delphi - TSQLConnection.Connect with InterBase 7.5 奇怪的三分钟延迟

环境:Delphi2009客户端应用程序(和一个Java),在Windows2003服务器上运行通过dbExpress连接到InterBase7.5.1(另一个Windows2003服务器)Delphi应用程序使用TSQLConnection对象的AfterConnect事件处理程序记录打开TSQLConnection的时间。在随机间隔中,连接需要三分钟的“额外时间”。我最初怀疑这可能是SQL查询的问题,但今天更详细的日志记录显示它是挂起的SQLConnection.Connect。我不确定这是否是网络、InterBase服务器或Delphi/dbExpress层的问题。有没有人经历过

delphi - Indy TIdTCPClient 组件偶尔不超时,收不到数据

我正在使用InternetDirectTIdTCPClient组件与远程服务通信以检索通常大小约为5k的消息。在典型的操作中,我将向服务发送大约400个请求,每个请求大约需要1秒才能完成。大多数时候一切都很完美。但是,大约百分之一的时间请求需要189秒,而我根本没有收到任何数据。为了便于讨论,我将其称为失败。我特别有兴趣了解发生故障时究竟发生了什么,这样我就可以向服务发布者提供证据。首先,失败是不可重现的。如果我重新发送一个失败的请求,它很有可能(可能是99%)成功。我还会捕获发生故障时发送的请求,因此我能够确认请求的格式是否正确。我假设在失败期间我得到了一些数据,但不是全部。这就是为

unit-testing - 如何发送 RST 而不是正常关闭以进行测试?

当通过RST标志关闭TCP连接而不是通过正常的握手关闭连接时,我有一些代码似乎无法很好地处理它。“连接被对等方重置”的情况。我想编写一个始终通过RST关闭的TCP服务器,以便我可以重现该错误并为此编写一些单元测试。所以……如何发送RST而不是正常关闭以进行测试? 最佳答案 您可以通过修改您的SO_LINGER设置来获得RST。您希望将l_onoff设置为非零值并将l_linger设置为零。完成后,关闭套接字将导致重置。structlingerlng;lng.l_onoff=1;lng.l_linger=0;setsockopt(so

delphi - TCP 客户端未接收到来自 RTSP 服务器的响应

在DelphiXE2中,我使用TTCPClient组件与RTSP服务器通信。在反复试验未从服务器返回响应后,我将项目切换为通过端口80(而不是RTSP的554)发送HTTP请求,并尝试将请求发送到网站(具体为www.google.com)。我仍然没有收到任何回复。我在主窗体(Form1)上有一个名为Client的TTCPClient组件,一个名为TMemo的控件Log、一个名为txtHost的TEdit控件和一个TBitBtn控件。以下是代码的相关部分:连接到服务器procedureTForm1.BitBtn1Click(Sender:TObject);beginifClient.Ac

delphi - 谁将 TCP 窗口大小设置为 0,Indy 还是 Windows?

我们有一个应用程序服务器,观察到它在网络拥塞时(在客户端站点)有时发送TCP窗口大小为0的header。我们想知道是Indy还是底层Windows层负责将TCP窗口大小从标称的64K向下调整以适应可用吞吐量。我们将能够在它变为0时采取行动(没有发送任何内容,用户等待=>不好)。因此,欢迎任何指向Indy代码的信息、链接和指针...免责声明:我不是网络专家。请保持普通人可以理解的答案;-)注意:它是WindowsServer2003SP2上的Indy9/D2007。更多细节:TCP零窗口情况发生在与数据库服务器通信的中间层。它发生在最终用户提示客户端应用程序变慢的同一时刻(这就是触发网络

delphi - 向所有连接的客户端发送命令

我有一个TIdHttpServer我必须保持连接打开才能将一些命令发送回客户端。我想在按下按钮并向所有连接的客户端发送命令时进行迭代。我该怎么做? 最佳答案 您可以使用Contexts属性获取客户端,然后使用每个客户端的IOHandler发送消息。VarClients:TList;i:integer;beginifnotAssigned(IdTCPServer1.Contexts)thenexit;Clients:=IdTCPServer1.Contexts.LockList;tryfori:=0toClients.Count-1d

Delphi:限制 TCP 连接

我在我的Delphi应用程序中使用TServerSocket组件。我想限制客户端连接,比如说一千个。不幸的是我不知道该怎么做。该组件不提供任何属性,如“MaxConnections”或任何其他类似的属性。我使用OnGetThread事件创建新的服务器线程(TServerClientThread)。为了获得事件连接数,我使用了“Socket.ActiveConnections”属性。不幸的是,我不知道该怎么办。当连接数超过限制时,我尝试不在OnGetThread过程中创建任何线程,但它没有任何改变-客户端,即使它无法发送或接收任何信息,它也可以连接到服务器并保持连接。不允许新客户端连接或

delphi - 如何处理网络丢失和 Indy IdTCPServer

我已经使用IdTCPServer组件创建了一个客户端/服务器应用程序。客户端连接并在应用程序的整个生命周期中保持持久连接。如果网络连接断开(这种情况经常发生,因为客户端使用无线无线网卡连接),客户端将自动重新连接。这一切都很好。我的问题是处理服务器上与丢失连接对应的套接字。他们不会检测到网络中断并自行断开连接。在阅读了几篇相关文章后,我了解到服务器无法知道连接是否断开。它必须等待某个事件才能发现这一点。所以我的问题是,我是否应该在我的服务器中构建某种机制来定期“处理”连接断开的套接字?如果是这样,怎么办?我认为一种方法是循环遍历所有连接并尝试向它们发送数据。我发现这会触发所需的“事件”

delphi - Indy 写缓冲/高效 TCP 通信

我知道,我问了很多问题......但作为一名新的delphi开发人员,我一直在思考所有这些问题:)这个使用indy10处理TCP通信。为了提高通信效率,我将客户端操作请求编码为单个字节(在大多数情况下,当然后面跟着其他数据字节,但在这种情况下只有一个字节)。问题是varBytes:TBytes;...SetLength(Bytes,1);Bytes[0]:=OpCode;FConnection.IOHandler.Write(Bytes,1);ErrorCode:=Connection.IOHandler.ReadByte;不会立即发送该字节(至少不会调用服务器执行处理程序)。例如,如

delphi - 从 "Connection Reset By Peer"Indy TCP 客户端恢复

在这种情况下我应该如何恢复?服务器崩溃,连接异常关闭。对几乎所有内容的调用都会导致“对等方重置连接”异常。我似乎已经通过在exceptblock内的TIdTCPClient对象上调用Disconnect来修复它,但它导致了一个带有相同消息的最终异常(我在第二个try-exceptblock中捕获了它)。这是Indy10和DelphiXE2。tryifnotEcomSocket.ConnectedthenEcomSocket.Connect();exceptone:ExceptiondobegintryEcomSocket.Disconnect();exceptMessageDlg('C