我可以获取Indy TCP连接缓冲区中但尚未传输的字节大小吗?

问题描述

我想使用Indy TCP以最大可能的速度通过Internet连接发送一些(大)文件。我写了一个简单的应用程序来测试Indy TCP Client-Server连接的工作方式。

我发现的是:

  • 所有写入套接字的操作都会立即发生
  • 即使在我写完disconnect之后,仍然可以在另一侧接收到数据,即使已读取
  • 数据可以具有任何大小;我写了100 MB,我收到了每一分。

因此,这意味着要写入的套接字上有一个传输缓冲区。看起来它可以具有任何大小...如果我写大量数据(比如说100 MB),我认为它不是在单个操作中传输的,而是在小的块中(比如说1 MB)传输的。因此,随着数据的传输,当所有数据都被传输时,该缓冲区会缩小直到达到零。我需要的是随时知道该缓冲区何时需要填充的缓冲区的长度,因此我可以连续写而不会占用整个计算机内存。

我不知道我在这里写的内容是否有意义...如果没有,请告诉我删除该问题并提出一个更一般的问题。最后,我想要的是通过Indy TCP连接以最快的速度(意味着异步)发送文件,但带有进度条和取消按钮。

这是测试应用程序:

procedure TClient.Execute;
var Cmd: Cardinal;
    Txt: String;
    Buff: TIdBytes;
    Size: Integer;
begin
 Size:= 5000000;
 SetLength(Buff,Size);
 Buff[0]:= 33;
 Buff[Size-1]:= 55;

 Client.Connect;
 Cmd:= 1234;
 Client.socket.Write(Cmd);
 Client.socket.Write(Size);
 Client.socket.Write(Buff);
 Txt:= 'client finished transmision';
 SendMessage(RWnd,WM_USER,WParaM(@Txt),0);
 Client.disconnect;
 Txt:= 'client disconected';
 SendMessage(RWnd,0);
end;

procedure TForm1.ServerExecute(AContext: TIdContext);
var Cmd: Cardinal;
    Mess: String;
    Buff: TIdBytes;
    Size: Integer;
begin
  Mess:= 'Server ready';
  SendMessage(Handle,WParaM(@Mess),0);

  Cmd:= AContext.Connection.socket.ReadUInt32;
  Mess:= 'Server receive command';
  SendMessage(Handle,0);

  if Cmd = 1234 then begin
   Size:= AContext.Connection.socket.ReadInt32;
   Sleep(4000);
   Mess:= 'Server start reading';
   SendMessage(Handle,0);
   AContext.Connection.socket.ReadBytes(Buff,Size);
   Mess:= IntToStr(Buff[0]) + ' / ' + IntToStr(Buff[Size-1]);
   SendMessage(Handle,0);
  end;

  Mess:= 'Server closed connection';
  SendMessage(Handle,0);
end;

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)