草庐IT

C++ Builder - 使用 TIdTCPServer 以编程方式创建 TCP 服务器连接

我需要使用TIdTCPServer组件实现一个TCP服务器连接。我已经使用GUI(拖放)及其工作完成了它。但我需要拆分表单和TCP实现。到目前为止我看到的示例代码总是使用TIdTCPServer作为TForm类的成员。(拖放的结果)。我如何调用从TForm实现的TCPConnection类TCPConnectionCConnection=newTCPConnection(Owner,this);以下是我尝试创建TCP服务器连接的方法。TCPConnection::TCPConnection(TComponent*Owner,TForm4*TSuperForm){IdTCPServer1

tcp - Indy TCP - 循环读取数据

TCP服务器每8毫秒连续发送一次数据帧。我想编写一个能够接收这些数据帧的客户端。Indy9中是否有任何程序可以知道缓冲区中是否有可用数据?我当前的程序如下(我正在使用线程):procedureTThreadRead.Execute;varbuffer:array[0..755]ofbyte;//s1:string;//i:integer;beginIdTCPClient1.RecvBufferSize:=756;IdTCPClient1.Connect;whileTerminated=falsedobeginifIdTCPClient1.InputBuffer.Size=0thenId

delphi - 如何在 Delphi XE2 中建立 TCP/IP 连接?

我必须在DelphiXE2中开发一个简单的应用程序。此应用程序将使用TCP/IP协议(protocol)连接到具有IP地址(例如xxx.xxx.xxx.xxx)和某些端口号(例如xxxx)的服务器上运行的服务,并将获得服务器上运行的服务的回复。我创建了两个文本框:txtRequestMsg、txtReplyMsg和一个名为Connect的按钮。我需要打开一个TCP连接并发送一些数据并返回一些数据作为响应,类似于ping,但不使用ICMP,仅使用原始TCP。 最佳答案 为各种TCP客户端(发起)和TCP服务器(应答)协议(protoc

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

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

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 - 如何处理网络丢失和 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

delphi - 当设置为 500 毫秒时,*某些* PC 上的 TCP 连接超时为 20 或 21 秒

我得到了10台新PC,所有(据说)都新安装了Windows7Pro,没有对它们进行任何其他操作。我有一个程序,用DelphiXE2编码,使用Indy10组件进行网络连接。我将我的TIdTcpCleint的“连接超时”和“读取超时”属性设置为500ms,将“resusesocket”设置为“o/sdependant”(我还尝试将其设置为No)并保留“使用Nagle”(无论设置为True是什么(我也尝试过设置为false)。这就是问题所在:当我在这些PC上运行相同的.EXE并测试我拔出网络电缆的情况时,我的调试跟踪显示连接尝试/连接超时发生在同一秒或下一秒(带有粒度为1秒)-但在其他情况下