コード例 #1
0
            public override int Read(byte[] buffer, int offset, int count)
            {
                if (!buffer.IsSafeIndex(offset, length: count))
                {
                    throw new System.ArgumentException("Invalid offset/count combination [bufferSize:{0} offset:{1} count:{2}]".CheckedFormat(buffer.SafeLength(), offset, count));
                }

                int putToOffset = offset;

                int totalCountTransferred = 0;

                for (; totalCountTransferred < count;)
                {
                    if (currentBuffer == null)
                    {
                        currentBufferListIndex++;
                        if (currentBufferListIndex < bufferList.SafeCount())
                        {
                            currentBuffer               = bufferList[currentBufferListIndex];
                            currentBufferReadOffset     = currentBuffer.header.Length;
                            currentBufferRemainingCount = Math.Max(0, currentBuffer.byteCount - currentBufferReadOffset);
                        }
                    }

                    if (currentBuffer == null)
                    {
                        break;
                    }

                    int     iterCopyCount  = Math.Min(count - totalCountTransferred, currentBufferRemainingCount);
                    byte [] copyFromBuffer = currentBuffer.byteArray;

                    if (iterCopyCount <= 8)
                    {
                        for (int idx = 0; idx < iterCopyCount; idx++)
                        {
                            buffer[putToOffset++] = copyFromBuffer[currentBufferReadOffset++];
                        }
                    }
                    else
                    {
                        System.Buffer.BlockCopy(copyFromBuffer, currentBufferReadOffset, buffer, putToOffset, iterCopyCount);

                        currentBufferReadOffset += iterCopyCount;
                        putToOffset             += iterCopyCount;
                    }

                    currentBufferRemainingCount -= iterCopyCount;
                    totalCountTransferred       += iterCopyCount;

                    if (currentBufferRemainingCount <= 0)
                    {
                        currentBuffer = null;
                    }
                }

                return(totalCountTransferred);
            }
コード例 #2
0
ファイル: Clients.cs プロジェクト: aslyr/BeetlexSample
        private static void SendCompleted(SocketAsyncEventArgs e)
        {
            SocketAsyncEventArgsX ex = (SocketAsyncEventArgsX)e;

            Buffers.Buffer buffer    = (Buffers.Buffer)ex.BufferX;
            AsyncTcpClient tcpclient = (AsyncTcpClient)e.UserToken;

            try
            {
                if (e.SocketError == SocketError.IOPending || e.SocketError == SocketError.Success)
                {
                    System.Threading.Interlocked.Increment(ref tcpclient.mSendQuantity);
                    tcpclient.mSendBytes += e.BytesTransferred;
                    if (e.BytesTransferred < e.Count)
                    {
                        buffer.Postion = buffer.Postion + e.BytesTransferred;
                        buffer.SetLength(buffer.Length - e.BytesTransferred);
                        buffer.AsyncTo(tcpclient.mSendEventArgs, tcpclient.Socket);
                    }
                    else
                    {
                        IBuffer nextbuf = buffer.Next;
                        try
                        {
                            buffer.Completed?.Invoke(buffer);
                        }
                        catch
                        {
                        }
                        buffer.Free();
                        if (nextbuf != null)
                        {
                            tcpclient.CommitBuffer(nextbuf);
                        }
                        else
                        {
                            tcpclient.SendCompleted();
                        }
                    }
                }
                else
                {
                    Buffers.Buffer.Free(ex.BufferX);
                    tcpclient.DisConnect();
                    tcpclient.ProcessError(new SocketException((int)e.SocketError), $"Send error {e.SocketError}");
                }
                if (tcpclient.SocketProcessHandler != null)
                {
                    tcpclient.SocketProcessHandler.SendCompleted(tcpclient, e);
                }
            }
            catch (Exception e_)
            {
                tcpclient.ProcessError(e_, "client network send error!");
            }
        }
コード例 #3
0
        public Rectangle2D(Vector3 position, Vector3 scale, float rotation, Color color)
        {
            vertexArray     = new VertexArray();
            FillIndexBuffer = new IndexBuffer(FillIndices);
            vertexBuffer    = new Buffers.Buffer(Vertices, 3);

            vertexArray.AddBuffer(vertexBuffer, 0);

            Position = Matrix4.CreateTranslation(position);
            Scale    = Matrix4.CreateScale(scale);
            Rotation = Matrix4.CreateRotationZ(rotation);
            Color    = color;
        }
コード例 #4
0
ファイル: Clients.cs プロジェクト: mingyaaaa/BeetleX
 internal void CommitBuffer(IBuffer buffer)
 {
     try
     {
         Buffers.Buffer bf = (Buffers.Buffer)buffer;
         bf.UserToken = this;
         ((Buffers.Buffer)buffer).AsyncTo(this.mSendEventArgs, this.Socket);
     }
     catch (Exception e_)
     {
         Buffers.Buffer.Free(buffer);
         DisConnect();
         ProcessError(e_, "session send data error!");
     }
 }
コード例 #5
0
ファイル: Clients.cs プロジェクト: Grart/BeetleX
 internal void CommitBuffer(IBuffer buffer)
 {
     try
     {
         Buffers.Buffer bf = (Buffers.Buffer)buffer;
         bf.UserToken = this;
         /// <see cref="AsyncTcpClient.Connect"/> mSendEventArgs.Completed += IO_Completed
         ((Buffers.Buffer)buffer).AsyncTo(this.mSendEventArgs, this.Socket);
     }
     catch (Exception e_)
     {
         Buffers.Buffer.Free(buffer);
         DisConnect();
         ProcessError(e_, "session send data error!");
     }
 }
コード例 #6
0
ファイル: Clients.cs プロジェクト: mingyaaaa/BeetleX
 private void BeginReceive()
 {
     if (IsConnected)
     {
         Buffers.Buffer buffer = (Buffers.Buffer)ReceiveBufferPool.Pop();
         buffer.UserToken = this;
         try
         {
             buffer.AsyncFrom(mReceiveEventArgs, mSocket);
         }
         catch (Exception e_)
         {
             buffer.Free();
             DisConnect();
             ProcessError(e_, "client begin network receive error!");
         }
     }
 }
コード例 #7
0
ファイル: Clients.cs プロジェクト: Grart/BeetleX
 public void BeginReceive()
 {
     if (IsConnected && System.Threading.Interlocked.Exchange(ref mReceiveState, 1) == 0)
     {
         Buffers.Buffer buffer = (Buffers.Buffer)BufferPool.Pop();
         buffer.UserToken = this;
         try
         {
             buffer.AsyncFrom(mReceiveEventArgs, mSocket);/// see ref=<see cref="SocketAsyncEventArgs.Completed"/>
         }
         catch (Exception e_)
         {
             InitReceiveState();
             buffer.Free();
             DisConnect();
             ProcessError(e_, "client begin network receive error!");
         }
     }
 }
コード例 #8
0
        private void OnWriterFlash(IBuffer data)
        {
            int index = 0;

            if (data == null)
            {
                return;
            }
            Buffers.Buffer buffer = (Buffers.Buffer)data;
            try
            {
                while (buffer != null)
                {
                    buffer.To(Socket);
                    System.Threading.Interlocked.Add(ref mSendBytes, buffer.Length);
                    System.Threading.Interlocked.Increment(ref mSendQuantity);
                    index++;
                    var freebuf = buffer;
                    buffer = (Buffers.Buffer)buffer.Next;
                    freebuf.Free();
                }
            }
            catch (ObjectDisposedException ode)
            {
                Buffers.Buffer.Free(buffer);
                DisConnect();
                throw ode;
            }
            catch (SocketException se)
            {
                Buffers.Buffer.Free(buffer);
                DisConnect();
                throw se;
            }
            catch (Exception e_)
            {
                Buffers.Buffer.Free(buffer);
                throw e_;
            }
        }
コード例 #9
0
 private void BeginReceive()
 {
     if (IsConnected)
     {
         Buffers.Buffer buffer = (Buffers.Buffer)BufferPool.ReceiveDefault.Pop();
         if (!buffer.BindIOCompleted)
         {
             buffer.BindIOEvent(IO_Completed);
         }
         buffer.UserToken = this;
         try
         {
             buffer.AsyncFrom(mSocket);
         }
         catch (Exception e_)
         {
             buffer.Free();
             DisConnect();
             ProcessError(e_, "client begin network receive error!");
         }
     }
 }
コード例 #10
0
        public Message Update(INamedValueSet buildPayloadDataFromNVS = null, string buildPayloadDataFromString = null, BufferHeaderFlags?orInFlags = null)
        {
            if (buildPayloadDataFromNVS != null)
            {
                NVS = buildPayloadDataFromNVS;
            }

            if (buildPayloadDataFromString != null)
            {
                String = buildPayloadDataFromString;
            }

            if (orInFlags != null)
            {
                Buffers.Buffer firstBuffer = bufferList.SafeAccess(0);
                if (firstBuffer != null)
                {
                    firstBuffer.Update(orInFlags: orInFlags);
                }
            }

            return(this);
        }
コード例 #11
0
            public override void Write(byte[] buffer, int offset, int count)
            {
                if (!buffer.IsSafeIndex(offset, length: count))
                {
                    throw new System.ArgumentException("Invalid offset/count combination [bufferSize:{0} offset:{1} count:{2}]".CheckedFormat(buffer.SafeLength(), offset, count));
                }

                Buffers.BufferPool useBufferPool = message.bufferSourcePool ?? fallbackDefaultBufferPool;

                int getFromOffset = offset;

                int totalCountTransferred = 0;

                for (; totalCountTransferred < count;)
                {
                    if (currentBuffer == null)
                    {
                        QpcTimeStamp tsNow = QpcTimeStamp.Now;

                        currentBuffer = useBufferPool.Acquire(tsNow);

                        if (currentBuffer == null)
                        {
                            throw new System.OutOfMemoryException("Unable to acquire a buffer from the message bufferPool");
                        }

                        bufferList.Add(currentBuffer);

                        if (message.State == MessageState.Initial)
                        {
                            message.SetState(tsNow, MessageState.Data, "BufferListWriteStream.Write");
                        }
                    }

                    int iterCopyCount = Math.Min(count - totalCountTransferred, currentBuffer.AvailableSpace);

                    byte[] copyToBuffer = currentBuffer.byteArray;

                    if (iterCopyCount <= 8)
                    {
                        int copyToOffset = currentBuffer.byteCount;

                        for (int idx = 0; idx < iterCopyCount; idx++)
                        {
                            copyToBuffer[copyToOffset++] = buffer[getFromOffset++];
                        }
                    }
                    else
                    {
                        System.Buffer.BlockCopy(buffer, getFromOffset, copyToBuffer, currentBuffer.byteCount, iterCopyCount);

                        getFromOffset += iterCopyCount;
                    }

                    currentBuffer.byteCount += iterCopyCount;
                    if (currentBuffer.AvailableSpace <= 0)
                    {
                        currentBuffer = null;
                    }

                    totalCountTransferred += iterCopyCount;
                }
            }