delphi - 首次读取 TcpServer 后接收缓冲区数据丢失

标签 delphi delphi-xe3 tcp tcpserver

我尝试在客户端发送长度小于255的数据。

我尝试使用此协议(protocol)发送数据:

Lenghth+String
Byte+string
sample :
string = ABCD
sentdata = 4ABCD

这是我的服务器端代码:

procedure TfrmServer.tcpsrvr1Accept(Sender: TObject;
  ClientSocket: TCustomIpClient);
  var
  a : array of byte;
  I : Cardinal;
  mystr : string;
  b,Len : Byte;
begin
  ClientSocket.ReceiveBuf(b,1,0);// first try : get lenght
  Len := b;
  SetLength(a,Len+1);
  mmoRerult.Lines.Add(DateTimeToStr(now) + ' Data Len ' +
                  IntToStr(Len));
  ClientSocket.ReceiveBuf(a,Len,0); // second try : this lone is not worked.

  mystr := '';
  for I := 1 to 10 do
  begin
    mystr := mystr + Chr(a[i]);
  end;
  mmoRerult.Lines.Add(mystr);
  //Creating a stream
  mmoRerult.Lines.Add('--------------------');

end;

问题是,如果我在第一次可能的第一次尝试中读取所有数据,但是如果我在第二次尝试中读取数据是不可能的,不可能意味着数据不是正确,我认为读取指针位于前面,但如何重置。

并且ClientSocket.BytesReceived不给我读取之前收到的字节数。

我该如何解决这个问题,请不要告诉我首先读取 255 字节,我知道这样。

最佳答案

您正在将数据读入指针而不是缓冲区。像这样修复它:

ClientSocket.ReceiveBuf(pointer(a)^,Len,0);

请注意,直接读取 AnsiString 变量会容易得多。

var
  str: AnsiString;
....
SetLength(str, Len);
ClientSocket.ReceiveBuf(pointer(str)^,Len,0);

关于delphi - 首次读取 TcpServer 后接收缓冲区数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904494/

相关文章:

套接字的描述符可以转换为文件指针吗?

delphi - 如何合并使用单独图像列表的 TMainMenu 并保留每个菜单项的正确图像?

delphi - 对货币进行四舍五入

delphi - dcc 命令行编译器的 -i 和 -u 参数有什么区别?

delphi - 如何可靠地等待刚刚创建的线程?

c++ - 断开连接后重新连接 boost beast (asio) websocket 和 http 连接时出错

delphi - 从 Tstringgrid 检索数据并将检索到的数据填充到包含 word 的图表中的快速方法

delphi - 不兼容的类型 : 'WideChar' and 'Char' delphi 7

delphi - 以编程方式设置停靠工具栏的位置

python - 来自原始 tcp 数据包的实时视频