新修改: TCustomWinSocket类添加了 function ReceiveText: string; virtual; function TCustomWinSocket.ReceiveText: string; begin if ReceiveLength > 0 then begin SetLength(Result, ReceiveLength); ReceiveBuf(Result[1], Length(Result)); end else Result := ''; end;
function TServerClientWinSocket.ReceiveLength: Integer; begin Result := FStream.Position; end; function TServerClientWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer; var P1: Integer; PS, PD: Pointer; begin Lock; try P1 := FStream.Position; FStream.Seek(0, soBeginning); FStream.ReadBuffer(Buf, Count); if FStream.Position = P1 then begin {大于4K就放掉重新分配内存,否则,只是将指针移动到头部} if FStream.Size > 4096 then FStream.Clear else FStream.Seek(0, soBeginning); end else if FStream.Position < P1 then begin PS := Pointer(Longint(FStream.Memory) + FStream.Position); Move(PS^, FStream.Memory^, P1 - FStream.Position); FStream.Position := P1 - FStream.Position; end; finally UnLock; end; end;
function ReceiveText: string; virtual; function TCustomWinSocket.ReceiveText: string; begin if ReceiveLength > 0 then begin SetLength(Result, ReceiveLength); ReceiveBuf(Result[1], Length(Result)); end else Result := ''; end;
function TServerClientWinSocket.ReceiveLength: Integer; begin Result := FStream.Position; end; function TServerClientWinSocket.ReceiveBuf(var Buf; Count: Integer): Integer; var P, Len: Integer; begin Lock; try if FStream.Position >= Count then begin P := FStream.Position - Count; FStream.Position := P; Len := Count; end else begin P := 0; Len := FStream.Position; FStream.Position := P; end;
Result := FStream.Read(Buf, Len); if FStream.Position = FStream.Size then begin //大于4K就放掉重新分配内存,否则,只是将指针移动到头部 if FStream.Size > 4096 then FStream.Clear else FStream.Position := 0; end else begin FStream.Position := P + (Len - Result); end; finally UnLock; end; end;