Пример #1
0
        public unsafe static void BenchUnsafe()
        {
            var count = 10000000;
            var from  = new byte[1024];
            var to    = new byte[1024];
            var w     = Stopwatch.StartNew();

            fixed(byte *src = &from[0], dst = &to[0])
            {
                byte *dt = dst;

                for (int n = 0; n < 100; n++)
                {
                    for (int i = 0; i < count; i++)
                    {
                        FastBuffer.UnsafeBlockCopy(src, dst, n);
                    }
                    w.Stop();
                    Console.WriteLine($"FastBuffer.UnsafeBlockCopy {n}bytes cost:{w.ElapsedMilliseconds}");

                    w = Stopwatch.StartNew();
                    for (int i = 0; i < count; i++)
                    {
                        Buffer.MemoryCopy(src, dt, n, n);
                    }
                    w.Stop();
                    Console.WriteLine($"Buffer.MemoryCopy {n}bytes cost:{w.ElapsedMilliseconds}");

                    Console.WriteLine($"----------------------------{n}-------------------");
                }
            }
        }
Пример #2
0
 public void FastBufferCopy()
 {
     for (int i = 0; i < N; i++)
     {
         FastBuffer.BlockCopy(bufferFrom, 0, bufferTo, 0, Size);
     }
 }
Пример #3
0
 public unsafe void UnsafeFastBufferCopyFixed()
 {
     fixed(byte *src = &bufferFrom[0], dst = &bufferTo[0])
     {
         for (int i = 0; i < N; i++)
         {
             FastBuffer.UnsafeBlockCopy(src, dst, Size);
         }
     }
 }
Пример #4
0
        public void SerializeTo(Stream stream)
        {
            var bw = new BinaryWriter(stream);

            bw.Write(PacketId);
            bw.Write(SeqGuid.ToByteArray());
            bw.Write(SeqIdx);
            bw.Write(IsLast);
            bw.Write(SeqSize);
            bw.Write(FastBuffer.SliceBuffer(SeqBuffer, 0, SeqSize));
        }
Пример #5
0
        public void test_buffer_position()
        {
            const int size   = 15;
            const int data   = 123;
            var       buffer = new FastBuffer(size);

            Assert.AreEqual(0, buffer.GetPosition());

            buffer.Do(a => a.Write(data));

            Assert.AreEqual(sizeof(int), buffer.GetPosition());
        }
Пример #6
0
        public void test_fast_buffer()
        {
            var expected = Utility.GetTestArray(16);
            var buffer   = new FastBuffer(expected);

            Assert.AreEqual(expected.Length, buffer.GetCapacity());

            Assert.AreSame(expected, buffer.Get());

            Assert.IsTrue(buffer.Do(a => Utility.CheckTestArray(a, expected)));

            Assert.AreEqual(expected.Length, buffer.GetPosition());
        }
Пример #7
0
 public void TestCopy()
 {
     for (int i = 0; i < 1024; i++)
     {
         var src = new byte[i];
         var dst = new byte[i];
         var rd  = new Random(Guid.NewGuid().GetHashCode());
         rd.NextBytes(src);
         FastBuffer.BlockCopy(src, 0, dst, 0, src.Length);
         for (int n = 0; n < i; n++)
         {
             Assert.AreEqual(src[n], dst[n]);
         }
     }
 }
Пример #8
0
        public void test_buffer_resize()
        {
            const int size1  = 15;
            const int size2  = 25;
            var       buffer = new FastBuffer(size1);

            Assert.AreEqual(size1, buffer.GetCapacity());

            buffer.Reset(size2);

            Assert.AreEqual(size2, buffer.GetCapacity());

            buffer.Reset();

            Assert.AreEqual(size2, buffer.GetCapacity());
        }
Пример #9
0
 public static void TestCopy()
 {
     for (int i = 0; i < 1024; i++)
     {
         byte[] src = new byte[i];
         for (int n = 0; n < i; n++)
         {
             src[n] = (byte)n;
         }
         byte[] dst = new byte[i];
         FastBuffer.BlockCopy(src, 0, dst, 0, src.Length);
         for (int n = 0; n < i; n++)
         {
             if (src[n] != dst[n])
             {
                 Console.WriteLine("error:" + i);
             }
         }
     }
     Console.WriteLine("finish");
 }
Пример #10
0
        private static IEnumerable <ISequencePacket> CreateSequence(byte[] newBuff, int buffSize, int modRest, int origSize)
        {
            var idx = 0;

            for (var i = 0; i < newBuff.Length - modRest; i += buffSize, idx++)
            {
                var seqPacket = new SequencePacket
                {
                    SeqIdx    = (i / buffSize),
                    SeqBuffer = FastBuffer.SliceBuffer(newBuff, i, buffSize),
                    SeqSize   = buffSize,
                    IsLast    = false
                };
                yield return(seqPacket);
            }
            yield return(new SequencePacket
            {
                SeqIdx = idx,
                SeqBuffer = FastBuffer.SliceBuffer(newBuff, idx * buffSize, modRest),
                SeqSize = modRest,
                IsLast = true
            });
        }
Пример #11
0
        public void WritePacketToSocket(IDataPacket data, IChannel senderChannel, Guid guid, BufferObject buffObj,
                                        Socket sock, AsyncCallback sendCallback, SocketOperationContext operationCtx)
        {
            var ms = new MemoryStream();

            data.SerializeTo(ms);

            sbyte integrityHashSize = 0;

            if (senderChannel != null)
            {
                switch (senderChannel.IntegrityHash)
                {
                case Security.PacketIntegrityHash.Sha256:
                    integrityHashSize = 32;
                    break;

                case Security.PacketIntegrityHash.Crc32:
                    integrityHashSize = 4;
                    break;

                case Security.PacketIntegrityHash.Elf32:
                    integrityHashSize = 4;
                    break;
                }
            }

            var headerSize = 1 + (operationCtx != null ? 32 : 0) +
                             (senderChannel != null && senderChannel.EnsurePacketIntegrity ? integrityHashSize + 2 : 1);
            var sendBuff = new byte[ms.Length + headerSize + 4];

            FastBuffer.MemCpy(BitConverter.GetBytes(headerSize + ms.Length), 0, sendBuff, 0, 4);
            sendBuff[4] = operationCtx == null ? ((byte)0x0) : ((byte)0x1);
            sendBuff[5] = senderChannel != null && senderChannel.EnsurePacketIntegrity ? (byte)0x1 : (byte)0x0;
            if (senderChannel != null && senderChannel.EnsurePacketIntegrity)
            {
                sendBuff[6] = (byte)senderChannel.IntegrityHash;
            }

            if (operationCtx != null)
            {
                FastBuffer.MemCpy(operationCtx.OperationGuid.ToByteArray(), 0, sendBuff, 6, 16);
                FastBuffer.MemCpy(guid.ToByteArray(), 0, sendBuff, 22, 16);
            }

            var tmpBuff = new byte[ms.Length];

            ms.Seek(0, SeekOrigin.Begin);
            ms.Read(tmpBuff, 0, tmpBuff.Length);

            FastBuffer.MemCpy(tmpBuff, 0, sendBuff, operationCtx != null ? 38 : 6, tmpBuff.Length);

            var sendObj = new Peer.Peer.SendObject {
                Channel = senderChannel, Packet = data
            };

            if (sock.Connected)
            {
                sock.BeginSend(sendBuff, 0, sendBuff.Length, 0, sendCallback, sendObj);
            }
        }
Пример #12
0
        private void ReadDataCallback(IAsyncResult res)
        {
            var buffObj = (BufferObject)res.AsyncState;

            buffObj.ReadLen    = ChannelSocket.EndReceive(res);
            buffObj.TotalRead += buffObj.ReadLen;

            buffObj.CompleteBuff.AddRange(FastBuffer.SliceBuffer(buffObj.RecBuff, 0, buffObj.ReadLen));
            if (buffObj.CompleteBuff.Count < buffObj.PacketSize)
            {
                // keep reading
                if (buffObj.BufferSize < (buffObj.PacketSize - buffObj.CompleteBuff.Count))
                {
                    ChannelSocket.BeginReceive(buffObj.RecBuff, 0, buffObj.BufferSize, 0, ReadDataCallback, buffObj);
                }
                else
                {
                    ChannelSocket.BeginReceive(buffObj.RecBuff, 0, (buffObj.PacketSize - buffObj.CompleteBuff.Count),
                                               0, ReadDataCallback, buffObj);
                }
            }
            else
            {
                // full message was received
                var dataBuff    = buffObj.CompleteBuff.ToArray();
                var isOperation = BitConverter.ToBoolean(dataBuff, 0);
                int internalId;
                var operationGuid  = Guid.Empty;
                var connectionGuid = Guid.Empty;
                if (isOperation)
                {
                    operationGuid = new Guid(dataBuff.Slice(2, 16));
                    Debug.Print("Received operation guid: " + operationGuid);
                    connectionGuid = new Guid(dataBuff.Slice(18, 16));
                    internalId     = BitConverter.ToInt32(dataBuff, 34);
                }
                else
                {
                    internalId = BitConverter.ToInt32(dataBuff, 2);
                }

                if (_internalPacketTbl.ContainsKey(internalId))
                {
                    var packet = (IDataPacket)Activator.CreateInstance(_internalPacketTbl[internalId]);
                    var ms     = new MemoryStream(dataBuff)
                    {
                        Position = 2
                    };
                    packet.DeserializeFrom(ms);

                    if (packet is SynchronizePacket)
                    {
                        HandleSynchronizePacket(packet as SynchronizePacket);
                    }
                    else if (packet is SequenceInitPacket)
                    {
                        HandleSequenceInitPacket(packet as SequenceInitPacket);
                    }
                    else if (packet is SequencePacket)
                    {
                        HandleSequencePacket(packet as SequencePacket);
                    }
                    else if (packet is PeerRelocationRequestPacket)
                    {
                        HandleRelocationPacket(packet as PeerRelocationRequestPacket);
                    }
                    else if (packet is SocketOperationRequest)
                    {
                        HandleSocketOperationPacket(packet as SocketOperationRequest);
                    }
                }
                else if (ActiveSocketOperations.ContainsKey(operationGuid))
                {
                    using (var ms = new MemoryStream(dataBuff)
                    {
                        Position = 34
                    })
                    {
                        var packet = PacketProcessor.ParsePacket(ms);
                        packet.DeserializeFrom(ms);
                        ActiveSocketOperations[operationGuid].PacketReceived(packet, this);
                    }
                }
                else
                {
                    RawPacketReceived(dataBuff);
                }
                buffObj.ReadLen = 0;
                buffObj.CompleteBuff.Clear();
                buffObj.PacketSize = 0;
                ChannelSocket.BeginReceive(buffObj.RecBuff, 0, 4, 0, ReadLengthCallback, buffObj);
            }
        }
Пример #13
0
 public unsafe static void WriteUnsafe(string name, char[] buffer, int position)
 {
     fixed (char* src = name, dst = &buffer[position])
         FastBuffer.UnsafeBlockCopy((byte*)src, (byte*)dst, name.Length * 2);
 }
Пример #14
0
 public unsafe static void WriteUnsafe(char* tsrc, char* tdst, int size)
 {
     FastBuffer.UnsafeBlockCopy((byte*)tsrc, (byte*)tdst, size);
 }