Exemplo n.º 1
0
        public Task <byte[]> ReadAsync()
        {
            var tcs = new TaskCompletionSource <byte[]>();

            // 如果有缓存的包,从缓存中取
            if (this.recvBuffer.Count > 0)
            {
                var bytes = this.recvBuffer.First.Value;
                this.recvBuffer.RemoveFirst();
                tcs.TrySetResult(bytes);
            }
            // 没有缓存封包,设置回调等待
            else
            {
                this.Received = eEvent =>
                {
                    if (eEvent.EventState == EventState.DISCONNECTED)
                    {
                        tcs.TrySetException(new EException("socket disconnected in receive"));
                    }

                    using (var packet = new EPacket(eEvent.PacketPtr))
                    {
                        var bytes = packet.Bytes;
                        tcs.TrySetResult(bytes);
                    }
                };
            }
            return(tcs.Task);
        }
Exemplo n.º 2
0
        public void ReadAsync(Action <byte[], int> action)
        {
            // 如果有缓存的包,从缓存中取
            if (this.recvBuffer.Count > 0)
            {
                var bytes = this.recvBuffer.First.Value;
                this.recvBuffer.RemoveFirst();
                action(bytes, 0);
            }
            // 没有缓存封包,设置回调等待
            else
            {
                this.Received = eEvent =>
                {
                    if (eEvent.EventState == EventState.DISCONNECTED)
                    {
                        action(new byte[0], -1);
                    }

                    using (var packet = new EPacket(eEvent.PacketPtr))
                    {
                        var bytes = packet.Bytes;
                        action(bytes, 0);
                    }
                };
            }
        }
Exemplo n.º 3
0
        public void WriteAsync(byte[] data, byte channelID = 0, PacketFlags flags = PacketFlags.Reliable)
        {
            var packet = new EPacket(data, flags);

            NativeMethods.EnetPeerSend(this.peerPtr, channelID, packet.PacketPtr);
            // enet_peer_send函数会自动删除packet,设置为0,防止Dispose或者析构函数再次删除
            packet.PacketPtr = IntPtr.Zero;
        }
Exemplo n.º 4
0
 internal void OnReceived(EEvent eEvent)
 {
     // 如果应用层还未调用readasync则将包放到缓存队列
     if (this.Received == null)
     {
         using (var packet = new EPacket(eEvent.PacketPtr))
         {
             var bytes = packet.Bytes;
             this.recvBuffer.AddLast(bytes);
         }
     }
     else
     {
         Action <EEvent> localReceived = this.Received;
         this.Received = null;
         // 此调用将让await ReadAsync返回,所以null必须在此之前设置
         localReceived(eEvent);
     }
 }