Socket 多次触发OnRead解决方案

Socket 多次触发OnRead

//结构体IdentInfo
  TIdentInfo = record
    Ident: Integer;
    Action: Integer;
    Size: Integer;
  end;


//发送端
function Send(Socket: TCustomWinSocket; Action: Word; Mem: TMemoryStream): Boolean; overload;
var
  dataInfo: TIdentInfo;
begin      
  if(mem.Size=0 )then
  exit;
  dataInfo.Ident := IDENT;
  dataInfo.Action := Action;
  dataInfo.Size := mem.Size;
  Socket.SendBuf(dataInfo, SizeOf(dataInfo));
  Socket.SendBuf(mem.Memory^, mem.Size);
end;


//接受端
procedure OnClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  dataInfo: TIdentInfo;
  mem: TMemoryStream;
begin

  FillChar(dataInfo, SizeOf(dataInfo), 0);
  Socket.ReceiveBuf(dataInfo, SizeOf(dataInfo));
  mem := TMemoryStream.Create;
  if (dataInfo.Ident = Ident) then
  begin
    mem.Size := dataInfo.Size;
    FillChar(mem.Memory^, mem.Size, #0);
    mmo1.Lines.Add('mem Size1:' + inttostr(mem.Size));
    Socket.ReceiveBuf(mem.memory^, mem.Size);
    //中间处理过程
  end;
end;

---------------------------------------------

  Socket.SendBuf(dataInfo, SizeOf(dataInfo));
  Socket.SendBuf(mem.Memory^, mem.Size);
当客户端发送2组数据给服务端
第一组结构体TIdentInfo大小是12字节
第二组是数据流TMemoryStream大于12字节

现在问题是服务端接收总是以12字节每次的大小用TIdentInfo结构体把所有数据接收进去了
而后面的mem.Memory^根本接收不到数据
但有时候又可以接收到

Socket 多次触发OnRead解决方案
这个是抓包工具抓包看到的结果,
调试的时候可以看到 
  FillChar(dataInfo, SizeOf(dataInfo), 0);
  Socket.ReceiveBuf(dataInfo, SizeOf(dataInfo));
被触发了3次
------解决方案--------------------
你一次没读完,还有数据可读,仍然会触发的。
这个类一般配合TWinSocketStream和TServerClientThread使用