Exemple #1
0
 protected override void OnRawMessageReceived(TcpRawMessageReceivedEventArgs args)
 {
     if (ReceivedMessageFilter(args))
     {
         return;
     }
     MessageReceived?.Invoke(this, args);
 }
Exemple #2
0
 protected virtual bool ReceivedMessageFilter(TcpRawMessageReceivedEventArgs tcpRawMessageArgs)
 {
     return(false);
 }
Exemple #3
0
 protected virtual void OnRawMessageReceived(TcpRawMessageReceivedEventArgs args)
 {
 }
Exemple #4
0
        private void ProcessReceive(SocketAsyncEventArgs sockAsyncArgs)
        {
            if (!_isRunning)
            {
                return;
            }
            long clientID = (long)sockAsyncArgs.UserToken;

            if (!_clients.TryGetValue(clientID, out ClientContext clientContext))
            {
                return;
            }
            Socket sockClient = clientContext.ClientSocket;

            if (sockAsyncArgs.SocketError == SocketError.Success)
            {
                int recvCount = sockAsyncArgs.BytesTransferred;
                if (recvCount > 0)
                {
                    RingQueue clientRingBuffer = clientContext.ReceiveBuffer;
                    clientRingBuffer.Write(sockAsyncArgs.Buffer, sockAsyncArgs.Offset, recvCount);
                    //speed limit
                    if (clientContext.RecvSpeedController != null)
                    {
                        clientContext.RecvSpeedController.TryLimit(recvCount);
                    }

                    //try get a completed packet
                    List <DataPacket> messageList = null;
                    int endPos = 0;
                    try
                    {
                        messageList = _packetSpliter.GetPackets(clientRingBuffer.Buffer, 0, clientRingBuffer.DataLength, clientID, out endPos);
                    }
                    catch (NotImplementedException)
                    {
                        clientRingBuffer.Clear();
                    }
                    catch (Exception ex)
                    {
                        TcpRawMessageReceivedEventArgs rawMessage = new TcpRawMessageReceivedEventArgs()
                        {
                            Message  = null,
                            Error    = ex,
                            ClientID = clientID
                        };
                        OnRawMessageReceived(rawMessage);
                    }
                    if (messageList != null)
                    {
                        try
                        {
                            clientRingBuffer.Remove(endPos);
                            foreach (DataPacket messageSegment in messageList)
                            {
                                clientContext.RecvRawMessage.ClientID       = (long)sockClient.Handle;
                                clientContext.RecvRawMessage.MessageRawData = messageSegment.Data;
                                clientContext.RecvRawMessage.Tag            = messageSegment.Tag;
                                TcpRawMessageReceivedEventArgs rawMessage = new TcpRawMessageReceivedEventArgs()
                                {
                                    Message  = clientContext.RecvRawMessage,
                                    ClientID = clientID
                                };
                                OnRawMessageReceived(rawMessage);
                            }
                        }
                        catch (InvalidPacketException)
                        {
                            //invalid data received , indicates the client has made a illegal connection, we should disconnect it.
                            _logger?.Info("illegal connection detected");
                            if (_isRunning)
                            {
                                CloseClient(true, (long)sockClient.Handle);
                            }
                            return;
                        }
                        catch (Exception ex)
                        {
                            _logger?.Warn("an error has occurred during get packets", ex.Message);
                        }
                    }

                    //in case of the socket is closed, the following statements may cause of exception, so we should use try catch
                    try
                    {
                        if (!clientContext.ClientSocket.ReceiveAsync(sockAsyncArgs))
                        {
                            ProcessReceive(sockAsyncArgs);
                        }
                    }
                    catch { }
                }
                else
                {
                    _logger?.Warn($"sockAsyncArgs got an error: {sockAsyncArgs.SocketError.ToString()}");
                    if (_isRunning)
                    {
                        CloseClient(true, clientID);
                    }
                }
            }
            else
            {
                if (_isRunning)
                {
                    CloseClient(true, clientID);
                }
            }
        }
Exemple #5
0
        protected override void OnRawMessageReceived(TcpRawMessageReceivedEventArgs args)
        {
            if (args.Error == null)
            {
                ArraySegment <byte> rawSegment = args.Message.MessageRawData;
                if (rawSegment.Count >= 4)
                {
                    UInt32 specialMark = BitConverter.ToUInt32(rawSegment.Array, rawSegment.Offset);
                    if (specialMark == TcpUtility.JOIN_GROUP_MARK)
                    {
                        if (!EnableGroup)
                        {
                            return;
                        }

                        JoinGroupMessage joinGroupMsg = null;
                        if (!JoinGroupMessage.TryParse(rawSegment, out joinGroupMsg))
                        {
                            return;
                        }

                        if (_clients.TryGetValue(args.Message.ClientID, out ClientContext clientContext))
                        {
                            clientContext.Groups = joinGroupMsg.GroupSet;
                            AddClientToGroup(clientContext);
                        }
                        return;
                    }
                    else if (specialMark == TcpUtility.GROUP_TRANSMIT_MSG_MARK ||
                             specialMark == TcpUtility.GROUP_TRANSMIT_MSG_LOOP_BACK_MARK)
                    {
                        bool loopBack = specialMark == TcpUtility.GROUP_TRANSMIT_MSG_LOOP_BACK_MARK;
                        if (!EnableGroup)
                        {
                            return;
                        }
                        GroupTransmitMessage transPacket = null;
                        if (!GroupTransmitMessage.TryParse(rawSegment, out transPacket))
                        {
                            return;
                        }
                        try
                        {
                            if (!ServerConfig.AllowCrossGroupMessage)
                            {
                                ClientContext sourceClient = GetClient(args.Message.ClientID);
                                if (sourceClient == null || sourceClient.Groups == null || sourceClient.Groups.Count == 0)
                                {
                                    return;
                                }
                                foreach (string groupName in transPacket.GroupNameCollection)
                                {
                                    if (!sourceClient.Groups.Contains(groupName))
                                    {
                                        return;
                                    }
                                }
                            }
                            SendGroupMessageAsync(transPacket.GroupNameCollection, transPacket.TransMessageData.Array, transPacket.TransMessageData.Offset, transPacket.TransMessageData.Count
                                                  , loopBack ? -1 : args.Message.ClientID);
                        }
                        catch (Exception ex)
                        {
                            _logger?.Warn("Transmit group message exception.", ex.Message);
                        }
                        return;
                    }
                }
                if (ReceivedMessageFilter(args))
                {
                    return;
                }
            }

            MessageReceived?.Invoke(this, args);
            return;
        }