Ejemplo n.º 1
0
        /// <summary>
        /// Stop the server and disconnect any clients
        /// </summary>
        public void Stop()
        {
            disposed = true;

            disconnectAll();
            isRunning = false;
            this.listenSocket.Close();

            if (OnClientConnected != null)
            {
                foreach (var receiver in OnClientConnected.GetInvocationList())
                {
                    OnClientConnected -= (RemoteClientConnectedEventHandler)receiver;
                }
            }

            if (OnClientDisconnected != null)
            {
                foreach (var receiver in OnClientDisconnected.GetInvocationList())
                {
                    OnClientDisconnected -= (RemoteClientDisconnectedEventHandler)receiver;
                }
            }

            if (OnClientMessageReceived != null)
            {
                foreach (var receiver in OnClientMessageReceived.GetInvocationList())
                {
                    OnClientMessageReceived -= (RemoteClientMessageReceivedEventHandler)receiver;
                }
            }

            if (OnClientHoldMessageReceived != null)
            {
                foreach (var receiver in OnClientHoldMessageReceived.GetInvocationList())
                {
                    OnClientHoldMessageReceived -= (RemoteClientHoldMessageReceivedEventHandler)receiver;
                }
            }
        }
Ejemplo n.º 2
0
        // process an incoming payload
        private void processConnectionPayload(ByteArrayReaderWriter reader, NetcodePacketHeader header, int size, EndPoint sender)
        {
            if (checkReplay(header, sender))
            {
                return;
            }

            // encryption mapping was not registered, so don't bother
            int cryptIdx = encryptionManager.FindEncryptionMapping(sender, time);

            if (cryptIdx == -1)
            {
                log("No crytpo key for sender", NetcodeLogLevel.Debug);
                return;
            }

            // grab the decryption key and decrypt the packet
            var decryptKey = encryptionManager.GetReceiveKey(cryptIdx);

            var payloadPacket = new NetcodePayloadPacket()
            {
                Header = header
            };

            if (!payloadPacket.Read(reader, size - (int)reader.ReadPosition, decryptKey, protocolID))
            {
                return;
            }

            var clientIndex = encryptionManager.GetClientID(cryptIdx);
            var client      = clientSlots[clientIndex];

            // trigger callback

            if (OnClientMessageReceived != null)
            {
                OnClientMessageReceived(client, payloadPacket.Payload, payloadPacket.Length);
            }

            if (OnClientHoldMessageReceived != null)
            {
                int  numListeners = OnClientHoldMessageReceived?.GetInvocationList().Length ?? 0;
                int  numDone      = 0;
                bool released     = false;
                if (numListeners > 0)
                {
                    OnClientHoldMessageReceived?.Invoke(client, payloadPacket.Payload, payloadPacket.Length, () => {
                        numDone++;
                        if (numDone >= numListeners && !released)
                        {
                            released = true;
                            payloadPacket.Release();
                        }
                    });
                }
                else
                {
                    payloadPacket.Release();
                }
            }
            else
            {
                payloadPacket.Release();
            }
        }