delphi - 如何等待并读取来自 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;
解决方案
推荐阅读
- visual-studio - Can Docker Desktop for Windows Point To Remote Docker Engine?
- jquery - Proper way to implement radio buttons
- c# - PostgreSQL: command is already in progress
- sql - SQL:返回包含一个单词的记录,其中最后一个字母是除 K 之外的任何内容
- javascript - 如何在不知道谁具有 dir 属性的情况下获取方向(rtl/ltr)?
- scala - 单元测试:模拟嵌套的 scala val
- java - 有没有办法使用 hibernate-envers 审计一个在其 EmbeddedId 中具有 @Embedded 的实体
- tfs - 在 TFS 2017 中合并时可以限制目标分支浏览选项
- reactjs - 如何在json中的文本中添加换行符以做出反应
- java - 撒克逊人迁移 DynamicQueryContext 问题