function TServerClientWinSocket.WorkBlock(var Block: PBlock; Transfered: DWORD): DWORD; var ErrCode: Integer; Flag, BytesSend: Cardinal; begin Result := RESPONSE_SUCCESS; with Block^.Data do try case Block^.Data.Event of seRead: begin {利用内存流来保存收到的数据,有可能造成频繁的内存重新分配,可以改进} Lock; FStream.Clear; //<<---接收到流前先清空原内容, FStream.Write(Buffer, Transfered); UnLock; Self.Event(Self, seRead); if not PrepareRecv(Block) then Result := RESPONSE_FAIL; end; seWrite: begin // Self.Event(Self, seWrite); Dec(wsaBuffer.len, Transfered); if wsaBuffer.len <= 0 then begin { 发送完成,将Block置空,返回到FBlock的可使用的缓区中 } Block.Data.IsUse := False; Block := nil; end else begin { 数据还没发送完成,继续发送 } Flag := 0; Inc(wsaBuffer.buf, Transfered); FillChar(Overlapped, SizeOf(Overlapped), 0); if SOCKET_ERROR = WSASend(FSocket, @wsaBuffer, 1, BytesSend, Flag, @Overlapped, nil) then begin ErrCode := WSAGetLastError; if ErrCode <> ERROR_IO_PENDING then Error(Self, eeSend, ErrCode); end; end; end; end; except Result := RESPONSE_FAIL; end; end;