Socket 多次触发OnRead解决方案
Socket 多次触发OnRead
---------------------------------------------
Socket.SendBuf(dataInfo, SizeOf(dataInfo));
Socket.SendBuf(mem.Memory^, mem.Size);
当客户端发送2组数据给服务端
第一组结构体TIdentInfo大小是12字节
第二组是数据流TMemoryStream大于12字节
现在问题是服务端接收总是以12字节每次的大小用TIdentInfo结构体把所有数据接收进去了
而后面的mem.Memory^根本接收不到数据
但有时候又可以接收到

这个是抓包工具抓包看到的结果,
调试的时候可以看到
FillChar(dataInfo, SizeOf(dataInfo), 0);
Socket.ReceiveBuf(dataInfo, SizeOf(dataInfo));
被触发了3次
------解决方案--------------------
你一次没读完,还有数据可读,仍然会触发的。
这个类一般配合TWinSocketStream和TServerClientThread使用
//结构体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^根本接收不到数据
但有时候又可以接收到
这个是抓包工具抓包看到的结果,
调试的时候可以看到
FillChar(dataInfo, SizeOf(dataInfo), 0);
Socket.ReceiveBuf(dataInfo, SizeOf(dataInfo));
被触发了3次
------解决方案--------------------
你一次没读完,还有数据可读,仍然会触发的。
这个类一般配合TWinSocketStream和TServerClientThread使用