首次在TcpServer中读取后,接收缓冲区数据丢失

时间:2013-09-19 20:39:02

标签: delphi delphi-xe3 tcp-ip tcpserver

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

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

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;

问题是如果我在第一个可能first try中读取所有数据,但是如果我在second try中读取数据是不可能的,那么可能意味着数据不正确,我认为读指针是得到前面,但我怎么能重置。

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

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

1 个答案:

答案 0 :(得分:3)

您正在将数据读入指针而不是缓冲区。修复如下:

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

直接阅读AnsiString变量会更加容易。

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