Esempio n. 1
0
 /// <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();
 }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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))
 {
 }
Esempio n. 7
0
 /// <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);
 }