Example #1
0
        public override void OnReceiveData(byte[] _buffer)
        {
            try
            {
                List <byte> mBuffer = new List <byte>();
                for (int I = 0; I < _buffer.Length; I++)
                {
                    mBuffer.Add((byte)(_buffer[I] ^ Core.BuildConfig.GameKey_Client));
                }

                InPacket _packet = new InPacket();
                _packet.Set(mBuffer.ToArray());

                Networking.PacketHandler _handler = Globals.GetInstance().ServerInstance.GetPacket(_packet.GetOPC());
                if (_handler != null && _handler is Networking.PacketHandler)
                {
                    _handler.Set(this, mBuffer.ToArray());

                    if (_handler != null)
                    {
                        _handler.Handle();
                    }
                }
                else
                {
                    Core.Log.WriteError("Received unhandled packet! [" + _packet.GetOPC() + "]");
                }
            }
            catch { }
        }
Example #2
0
        private void OnDataReceived(IAsyncResult iAr)
        {
            try
            {
                int bytesReceived = socket.EndReceive(iAr);

                if (bytesReceived > 0)
                {
                    byte[] packetBuffer = new byte[bytesReceived];

                    Buffer.BlockCopy(buffer, 0, packetBuffer, 0, bytesReceived);
                    // Decrypt the bytes with the xOrKey.
                    for (int i = 0; i < bytesReceived; i++)
                    {
                        packetBuffer[i] ^= Core.Constants.xOrKeySend;
                    }

                    int oldLength = cacheBuffer.Length;
                    Array.Resize(ref cacheBuffer, oldLength + bytesReceived);
                    Buffer.BlockCopy(packetBuffer, 0, cacheBuffer, oldLength, packetBuffer.Length);

                    int startIndex = 0;                                  // Determs whre the bytes should split
                    for (int i = 0; i < cacheBuffer.Length; i++)
                    {                                                    // loop trough our cached buffer.
                        if (cacheBuffer[i] == 0x0A)
                        {                                                // Found a complete packet
                            byte[] newPacket = new byte[i - startIndex]; // determ the new packet size.
                            for (int j = 0; j < (i - startIndex); j++)
                            {
                                newPacket[j] = cacheBuffer[startIndex + j]; // copy the buffer to the buffer of the new packet.
                            }
                            packetCount++;

                            // Handle the packet instantly.
                            InPacket inPacket = new InPacket(newPacket);
                            if (inPacket.Id > 0)
                            {
                                PacketHandler <ServerClient> pHandler = NetworkTable.Instance.FindInternal(inPacket);
                                if (pHandler != null)
                                {
                                    //try {
                                    pHandler.Handle(this, inPacket);
                                    //} catch { /*Disconnect();*/ }
                                }
                            }

                            startIndex = i + 1;
                        }
                    }

                    if (startIndex > 0)
                    {
                        byte[] fullCopy = cacheBuffer;
                        Array.Resize(ref cacheBuffer, (cacheBuffer.Length - startIndex));
                        for (int i = 0; i < (cacheBuffer.Length - startIndex); i++)
                        {
                            cacheBuffer[i] = fullCopy[startIndex + i];
                        }
                        fullCopy = null;
                    }

                    socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnDataReceived), null);
                }
                else
                {
                    Disconnect();
                }
            }
            catch
            {
                Disconnect();
            }
        }