首页 > 解决方案 > 如何等待并读取来自 Indy TCP 套接字的所有可用数据?

问题描述

我编写了一个 Indy TCP 服务器/客户端应用程序来传输文件。在 Indy 中,似乎每次调用 TCP 套接字上的读取或写入操作都会减慢传输速度……我认为只有写入和读取(重放)的协议。但是,通过这种方式,我无法发送缓冲区的长度。所以,我需要从另一端读取所有可用数据,在一个连续的缓冲区中。如果没有可用数据,则此操作应先等待。这可能吗 ?我认为这是ReadFromSource方法的问题,但这没有记录在帮助中,我不知道它把读取的数据放在哪里。我的协议是在TIdIOHandlerStack后代中制作的,因此我可以访问受保护的 IOHandler 方法。

ReadFromSource编辑:在拍摄时似乎只有 32 KB。我更新RecvBufferSize到 2.1MB,当我发送 2MB 时,我得到大约 200 KB... :(

更新:这是我用来从源读取所有数据的代码。有时它可以工作,但有时不能读取整个数据......

function TIdEnhancedIOHandler.ReadAllBytes(var VBuffer: TIdBytes): Integer;
var LBytes, TmOut: Integer;
begin
 Result:= 0;
 Assert(FInputBuffer <> nil);
 if FInputBuffer.Size = 0 then TmOut:= -1 else TmOut:= 0;
 repeat
  LBytes:= ReadFromSource(False, TmOut, False);
  CheckForDisconnect(True, True);
  TmOut:= 0;
 until LBytes <= 0;
 Result:= FInputBuffer.Size;
 FInputBuffer.ExtractToBytes(VBuffer, -1, False);
end;

标签: delphitcpindydelphi-10.3-rio

解决方案


推荐阅读