/// <summary> /// 开始接收表单数据 /// </summary> internal void Receive() { try { SubBuffer.Size size = httpSocket.GetFormPage.MaxMemoryStreamSize; if ((contentLength = header.ContentLength) + sizeof(int) > (int)size >> 1) { SubBuffer.Pool.GetPool(size).Get(ref buffer); } else { SubBuffer.Pool.GetBuffer(ref buffer, contentLength + sizeof(int)); } contentLength -= (receiveEndIndex = header.CopyToFormData(ref buffer)); bufferSize = buffer.Length - sizeof(int); boundary = header.BoundaryIndex; httpSocket.SetTimeout(contentLength); if (onFirstBoundary()) { return; } } catch (Exception error) { httpSocket.DomainServer.RegisterServer.TcpServer.Log.Add(AutoCSer.Log.LogType.AutoCSer, error); } this.error(); }
/// <summary> /// 设置远程对象 /// </summary> /// <param name="value"></param> /// <param name="blockIndex">磁盘块编号</param> /// <param name="bufferSize">序列化缓冲区大小</param> /// <returns></returns> public unsafe bool Set(valueType value, int blockIndex, SubBuffer.Size bufferSize = SubBuffer.Size.Kilobyte4) { if (value == null) { SetNull(); return(true); } Server.TcpInternalClient client = ClientPool.Get(blockIndex); if (client != null) { BinarySerialize.Serializer serializer = BinarySerialize.Serializer.YieldPool.Default.Pop() ?? new BinarySerialize.Serializer(); SubBuffer.PoolBufferFull buffer = default(SubBuffer.PoolBufferFull); SubBuffer.Pool.GetPool(bufferSize).Get(ref buffer); try { fixed(byte *bufferFixed = buffer.Buffer) { byte *start = bufferFixed + buffer.StartIndex; serializer.SerializeNotNull(value, start, buffer.PoolBuffer.Pool.Size, ClientConfig.BinarySerializeConfig); AutoCSer.Net.TcpServer.ReturnValue <ulong> index; int size = serializer.Stream.ByteSize; if (serializer.Stream.Data.Data == start) { index = client.append(new AppendBuffer { Buffer = new SubArray <byte> { Array = buffer.Buffer, Start = buffer.StartIndex, Length = size }, Index = size == Size ? Index : 0, BlockIndex = (ushort)blockIndex }); } else { index = client.append(new AppendBuffer { Buffer = new SubArray <byte> { Array = serializer.Stream.GetArray(), Length = size }, Index = size == Size ? Index : 0, BlockIndex = (ushort)blockIndex }); } if (index.Type == Net.TcpServer.ReturnType.Success && index.Value != 0) { Index = index.Value; Size = size; value = Value; state = MemberState.Remote; return(true); } } } finally { buffer.Free(); serializer.Free(); } } return(false); }
/// <summary> /// 文件块 /// </summary> /// <param name="fileName">文件名称</param> /// <param name="index">磁盘块编号</param> /// <param name="maxFlushSize">最大等待写入字节数</param> /// <param name="cacheSize">文件块读取缓冲区大小</param> /// <param name="bufferSize">文件流缓冲区大小</param> /// <param name="log">日志处理</param> /// <param name="isDataCache">是否建立数据缓存</param> public File(string fileName, int index, int maxFlushSize = 1 << 20, int cacheSize = 100 << 20, SubBuffer.Size bufferSize = SubBuffer.Size.Kilobyte4, ILog log = null, bool isDataCache = true) : base(index, cacheSize, log, isDataCache) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentNullException("fileName is null"); } this.bufferSize = bufferSize; this.maxFlushSize = waitFlushFileSize = Math.Max(maxFlushSize, 0); FileInfo file = new FileInfo(fileName); this.fileName = file.FullName; if (file.Extension.toLower() != ExtensionName) { this.fileName += ExtensionName; } if (file.Exists) { writeStream = new FileStream(this.fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.Read, (int)bufferSize, FileOptions.None); fileLength = writeStream.Length; } else { writeStream = new FileStream(this.fileName, FileMode.CreateNew, FileAccess.Write, FileShare.Read, (int)bufferSize, FileOptions.None); fileLength = 0; } if (fileLength == 0) { writeWait.Set(1); writeRequests.Push(new WriteRequest(index)); } else { byte[] data = new byte[sizeof(int) * 3]; if (writeStream.Read(data, 0, sizeof(int) * 3) != sizeof(int) * 3) { Dispose(); throw new FileLoadException(this.fileName); } fixed(byte *dataFixed = data) { if (((*(int *)dataFixed ^ Pub.PuzzleValue) | (*(int *)(dataFixed + sizeof(int)) ^ (int)AutoCSer.IO.FileHead.DiskBlockFile) | (*(int *)(dataFixed + sizeof(int) * 2) ^ index)) != 0) { Dispose(); throw new FileLoadException(this.fileName); } } writeWait.Set(0); } writeStream.Seek(0, SeekOrigin.End); readWait.Set(0); AutoCSer.Threading.ThreadPool.TinyBackground.FastStart(read); AutoCSer.Threading.ThreadPool.Tiny.FastStart(write); }
/// <summary> /// 设置远程对象 /// </summary> /// <param name="value"></param> /// <param name="blockIndex">磁盘块编号</param> /// <param name="bufferSize">序列化缓冲区大小</param> /// <returns></returns> public async Task <bool> SetAsync(valueType value, int blockIndex, SubBuffer.Size bufferSize = SubBuffer.Size.Kilobyte4) { if (value == null) { SetNull(); return(true); } Server.TcpInternalClient client = ClientPool.Get(blockIndex); if (client != null) { BinarySerialize.Serializer serializer = BinarySerialize.Serializer.YieldPool.Default.Pop() ?? new BinarySerialize.Serializer(); SubBuffer.PoolBufferFull buffer = default(SubBuffer.PoolBufferFull); SubBuffer.Pool.GetPool(bufferSize).Get(ref buffer); try { int size; AppendBuffer appendBuffer = getAppendBuffer(ref value, serializer, ref buffer, out size); appendBuffer.BlockIndex = (ushort)blockIndex; AutoCSer.Net.TcpServer.ReturnValue <ulong> index = await client.appendAwaiter(appendBuffer); if (index.Type == Net.TcpServer.ReturnType.Success && index.Value != 0) { Index = index.Value; Size = size; value = Value; state = MemberState.Remote; return(true); } } finally { buffer.Free(); serializer.Free(); } } return(false); }
/// <summary> /// 文件流写入器 /// </summary> /// <param name="fileName">文件全名</param> /// <param name="mode">打开方式</param> /// <param name="fileShare">共享访问方式</param> /// <param name="fileOption">附加选项</param> /// <param name="bufferSize">缓冲区字节大小</param> /// <param name="log">日志处理</param> /// <param name="encoding">文件编码</param> internal FileStreamWriter(string fileName, FileMode mode, FileShare fileShare, FileOptions fileOption, SubBuffer.Size bufferSize, ILog log, EncodingCache encoding) { if (string.IsNullOrEmpty(fileName)) { throw new ArgumentNullException("fileName is null"); } FileName = fileName; this.log = log; this.fileShare = fileShare; this.fileOption = fileOption; this.encoding = encoding; bufferPool = SubBuffer.Pool.GetPool(bufferSize); open(mode); }
/// <summary> /// 文件流写入器 /// </summary> /// <param name="fileName">文件全名</param> /// <param name="mode">打开方式</param> /// <param name="fileShare">共享访问方式</param> /// <param name="fileOption">附加选项</param> /// <param name="bufferSize">缓冲区字节大小</param> /// <param name="log">日志处理</param> /// <param name="encoding">文件编码</param> public FileStreamWriter(string fileName, FileMode mode = FileMode.CreateNew, FileShare fileShare = FileShare.None, FileOptions fileOption = FileOptions.None, SubBuffer.Size bufferSize = SubBuffer.Size.Kilobyte4, ILog log = null, Encoding encoding = null) : this(fileName, mode, fileShare, fileOption, bufferSize, log, new EncodingCache(encoding ?? Encoding.UTF8)) { }
/// <summary> /// TCP 服务客户端 /// </summary> /// <param name="attribute">TCP 服务调用配置</param> /// <param name="receiveBufferSize">接受数据缓冲区字节大小</param> /// <param name="sendBufferSize">发送数据缓冲区字节大小</param> /// <param name="sendBufferMaxSize">发送数据缓存区最大字节大小</param> /// <param name="log">日志接口</param> internal CommandBuffer(ServerBaseAttribute attribute, SubBuffer.Size receiveBufferSize, SubBuffer.Size sendBufferSize, int sendBufferMaxSize, ILog log) : base(attribute, sendBufferMaxSize, log) { SendBufferPool = SubBuffer.Pool.GetPool(sendBufferSize); ReceiveBufferPool = SubBuffer.Pool.GetPool(receiveBufferSize); }