ReceivedHandshake() private méthode

private ReceivedHandshake ( double now, NetMessageType tp, int ptr, int payloadLength ) : void
now double
tp NetMessageType
ptr int
payloadLength int
Résultat void
		private void ReceivedUnconnectedLibraryMessage(double now, IPEndPoint senderEndpoint, NetMessageType tp, int ptr, int payloadByteLength)
		{
			NetConnection shake;
			if (m_handshakes.TryGetValue(senderEndpoint, out shake))
			{
				shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
				return;
			}

			//
			// Library message from a completely unknown sender; lets just accept Connect
			//
			switch (tp)
			{
				case NetMessageType.Discovery:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryRequest))
					{
						NetIncomingMessage dm = CreateIncomingMessage(NetIncomingMessageType.DiscoveryRequest, payloadByteLength);
						if (payloadByteLength > 0)
							Buffer.BlockCopy(m_receiveBuffer, ptr, dm.m_data, 0, payloadByteLength);
						dm.m_receiveTime = now;
						dm.m_bitLength = payloadByteLength * 8;
						dm.m_senderEndpoint = senderEndpoint;
						ReleaseMessage(dm);
					}
					return;

				case NetMessageType.DiscoveryResponse:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryResponse))
					{
						NetIncomingMessage dr = CreateIncomingMessage(NetIncomingMessageType.DiscoveryResponse, payloadByteLength);
						if (payloadByteLength > 0)
							Buffer.BlockCopy(m_receiveBuffer, ptr, dr.m_data, 0, payloadByteLength);
						dr.m_receiveTime = now;
						dr.m_bitLength = payloadByteLength * 8;
						dr.m_senderEndpoint = senderEndpoint;
						ReleaseMessage(dr);
					}
					return;
				case NetMessageType.NatIntroduction:
					HandleNatIntroduction(ptr);
					return;
				case NetMessageType.NatPunchMessage:
					HandleNatPunch(ptr, senderEndpoint);
					return;
				case NetMessageType.Connect:
					// proceed
					break;
				case NetMessageType.Disconnect:
					// this is probably ok
					LogVerbose("Received Disconnect from unconnected source: " + senderEndpoint);
					return;
				default:
					LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
					return;
			}

			// It's someone wanting to shake hands with us!

			int reservedSlots = m_handshakes.Count + m_connections.Count;
			if (reservedSlots >= m_configuration.m_maximumConnections)
			{
				// server full
				NetOutgoingMessage full = CreateMessage("Server full");
				full.m_messageType = NetMessageType.Disconnect;
				SendLibrary(full, senderEndpoint);
				return;
			}

			// Ok, start handshake!
			NetConnection conn = new NetConnection(this, senderEndpoint);
			m_handshakes.Add(senderEndpoint, conn);
			conn.ReceivedHandshake(now, tp, ptr, payloadByteLength);

			return;
		}
Exemple #2
0
		private void ReceivedUnconnectedLibraryMessage(double now, IPEndPoint senderEndpoint, NetMessageType tp, int ptr, int payloadByteLength)
		{
			NetConnection shake;
			if (m_handshakes.TryGetValue(senderEndpoint, out shake))
			{
				shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
				return;
			}

			//
			// Library message from a completely unknown sender; lets just accept Connect
			//
			switch (tp)
			{
				case NetMessageType.Discovery:
					HandleIncomingDiscoveryRequest(now, senderEndpoint, ptr, payloadByteLength);
					return;
				case NetMessageType.DiscoveryResponse:
					HandleIncomingDiscoveryResponse(now, senderEndpoint, ptr, payloadByteLength);
					return;
				case NetMessageType.NatIntroduction:
					HandleNatIntroduction(ptr);
					return;
				case NetMessageType.NatPunchMessage:
					HandleNatPunch(ptr, senderEndpoint);
					return;
				case NetMessageType.ConnectResponse:

					lock (m_handshakes)
					{
						foreach (var hs in m_handshakes)
						{
							if (hs.Key.Address.Equals(senderEndpoint.Address))
							{
								if (hs.Value.m_connectionInitiator)
								{
									//
									// We are currently trying to connection to XX.XX.XX.XX:Y
									// ... but we just received a ConnectResponse from XX.XX.XX.XX:Z
									// Lets just assume the router decided to use this port instead
									//
									var hsconn = hs.Value;
									m_connectionLookup.Remove(hs.Key);
									m_handshakes.Remove(hs.Key);

									LogDebug("Detected host port change; rerouting connection to " + senderEndpoint);
									hsconn.MutateEndpoint(senderEndpoint);

									m_connectionLookup.Add(senderEndpoint, hsconn);
									m_handshakes.Add(senderEndpoint, hsconn);

									hsconn.ReceivedHandshake(now, tp, ptr, payloadByteLength);
									return;
								}
							}
						}
					}

					LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
					return;
				case NetMessageType.Connect:
					// proceed
					break;
				case NetMessageType.Disconnect:
					// this is probably ok
					LogVerbose("Received Disconnect from unconnected source: " + senderEndpoint);
					return;
				default:
					LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
					return;
			}

			// It's someone wanting to shake hands with us!

			int reservedSlots = m_handshakes.Count + m_connections.Count;
			if (reservedSlots >= m_configuration.m_maximumConnections)
			{
				// server full
				NetOutgoingMessage full = CreateMessage("Server full");
				full.m_messageType = NetMessageType.Disconnect;
				SendLibrary(full, senderEndpoint);
				return;
			}

			// Ok, start handshake!
			NetConnection conn = new NetConnection(this, senderEndpoint);
			m_handshakes.Add(senderEndpoint, conn);
			conn.ReceivedHandshake(now, tp, ptr, payloadByteLength);

			return;
		}
        private void ReceivedUnconnectedLibraryMessage(double now, IPEndPoint senderEndpoint, NetMessageType tp, int ptr, int payloadByteLength)
        {
            NetConnection shake;

            if (m_handshakes.TryGetValue(senderEndpoint, out shake))
            {
                shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
                return;
            }

            //
            // Library message from a completely unknown sender; lets just accept Connect
            //
            switch (tp)
            {
            case NetMessageType.Discovery:
                HandleIncomingDiscoveryRequest(now, senderEndpoint, ptr, payloadByteLength);
                return;

            case NetMessageType.DiscoveryResponse:
                HandleIncomingDiscoveryResponse(now, senderEndpoint, ptr, payloadByteLength);
                return;

            case NetMessageType.NatIntroduction:
                HandleNatIntroduction(ptr);
                return;

            case NetMessageType.NatPunchMessage:
                HandleNatPunch(ptr, senderEndpoint);
                return;

            case NetMessageType.ConnectResponse:

                lock (m_handshakes)
                {
                    foreach (var hs in m_handshakes)
                    {
                        if (hs.Key.Address.Equals(senderEndpoint.Address))
                        {
                            if (hs.Value.m_connectionInitiator)
                            {
                                //
                                // We are currently trying to connection to XX.XX.XX.XX:Y
                                // ... but we just received a ConnectResponse from XX.XX.XX.XX:Z
                                // Lets just assume the router decided to use this port instead
                                //
                                var hsconn = hs.Value;
                                m_connectionLookup.Remove(hs.Key);
                                m_handshakes.Remove(hs.Key);

                                LogDebug("Detected host port change; rerouting connection to " + senderEndpoint);
                                hsconn.MutateEndpoint(senderEndpoint);

                                m_connectionLookup.Add(senderEndpoint, hsconn);
                                m_handshakes.Add(senderEndpoint, hsconn);

                                hsconn.ReceivedHandshake(now, tp, ptr, payloadByteLength);
                                return;
                            }
                        }
                    }
                }

                LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
                return;

            case NetMessageType.Connect:
                // proceed
                break;

            case NetMessageType.Disconnect:
                // this is probably ok
                LogVerbose("Received Disconnect from unconnected source: " + senderEndpoint);
                return;

            default:
                LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
                return;
            }

            // It's someone wanting to shake hands with us!

            int reservedSlots = m_handshakes.Count + m_connections.Count;

            if (reservedSlots >= m_configuration.m_maximumConnections)
            {
                // server full
                NetOutgoingMessage full = CreateMessage("Server full");
                full.m_messageType = NetMessageType.Disconnect;
                SendLibrary(full, senderEndpoint);
                return;
            }

            // Ok, start handshake!
            NetConnection conn = new NetConnection(this, senderEndpoint);

            m_handshakes.Add(senderEndpoint, conn);
            conn.ReceivedHandshake(now, tp, ptr, payloadByteLength);

            return;
        }
				}

				m_statistics.PacketReceived(bytesReceived, numMessages, numFragments);
				if (sender != null)
					sender.m_statistics.PacketReceived(bytesReceived, numMessages, numFragments);

			} while (m_socket.Available > 0);
		}

		/// <summary>
		/// If NetPeerConfiguration.AutoFlushSendQueue() is false; you need to call this to send all messages queued using SendMessage()
		/// </summary>
		public void FlushSendQueue()
		{
			m_executeFlushSendQueue = true;
		}

		internal void HandleIncomingDiscoveryRequest(double now, NetEndPoint senderEndPoint, int ptr, int payloadByteLength)
		{
			if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryRequest))
			{
				NetIncomingMessage dm = CreateIncomingMessage(NetIncomingMessageType.DiscoveryRequest, payloadByteLength);
				if (payloadByteLength > 0)
					Buffer.BlockCopy(m_receiveBuffer, ptr, dm.m_data, 0, payloadByteLength);
				dm.m_receiveTime = now;
				dm.m_bitLength = payloadByteLength * 8;
				dm.m_senderEndPoint = senderEndPoint;
				ReleaseMessage(dm);
			}
		}

		internal void HandleIncomingDiscoveryResponse(double now, NetEndPoint senderEndPoint, int ptr, int payloadByteLength)
		{
			if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryResponse))
			{
				NetIncomingMessage dr = CreateIncomingMessage(NetIncomingMessageType.DiscoveryResponse, payloadByteLength);
				if (payloadByteLength > 0)
					Buffer.BlockCopy(m_receiveBuffer, ptr, dr.m_data, 0, payloadByteLength);
				dr.m_receiveTime = now;
				dr.m_bitLength = payloadByteLength * 8;
				dr.m_senderEndPoint = senderEndPoint;
				ReleaseMessage(dr);
			}
		}

		private void ReceivedUnconnectedLibraryMessage(double now, NetEndPoint senderEndPoint, NetMessageType tp, int ptr, int payloadByteLength)
		{
			NetConnection shake;
			if (m_handshakes.TryGetValue(senderEndPoint, out shake))
			{
				shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
				return;
			}

			//
			// Library message from a completely unknown sender; lets just accept Connect
			//
			switch (tp)
			{
				case NetMessageType.Discovery:
					HandleIncomingDiscoveryRequest(now, senderEndPoint, ptr, payloadByteLength);
					return;
				case NetMessageType.DiscoveryResponse:
					HandleIncomingDiscoveryResponse(now, senderEndPoint, ptr, payloadByteLength);
					return;
				case NetMessageType.NatIntroduction:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
						HandleNatIntroduction(ptr);
					return;
				case NetMessageType.NatPunchMessage:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
						HandleNatPunch(ptr, senderEndPoint);
					return;
				case NetMessageType.NatIntroductionConfirmRequest:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
						HandleNatPunchConfirmRequest(ptr, senderEndPoint);
					return;
				case NetMessageType.NatIntroductionConfirmed:
					if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
						HandleNatPunchConfirmed(ptr, senderEndPoint);
					return;
				case NetMessageType.ConnectResponse:

					lock (m_handshakes)
					{
						foreach (var hs in m_handshakes)
						{
							if (hs.Key.Address.Equals(senderEndPoint.Address))
							{
								if (hs.Value.m_connectionInitiator)
								{
									//
									// We are currently trying to connection to XX.XX.XX.XX:Y
									// ... but we just received a ConnectResponse from XX.XX.XX.XX:Z
									// Lets just assume the router decided to use this port instead
									//
									var hsconn = hs.Value;
									m_connectionLookup.Remove(hs.Key);
									m_handshakes.Remove(hs.Key);

									LogDebug("Detected host port change; rerouting connection to " + senderEndPoint);
									hsconn.MutateEndPoint(senderEndPoint);

									m_connectionLookup.Add(senderEndPoint, hsconn);
									m_handshakes.Add(senderEndPoint, hsconn);
        private void ReceivedUnconnectedLibraryMessage(IPEndPoint senderEndpoint, NetMessageType tp, int ptr, int payloadByteLength)
        {
            NetConnection shake;

            if (m_handshakes.TryGetValue(senderEndpoint, out shake))
            {
                shake.ReceivedHandshake(tp, ptr, payloadByteLength);
                return;
            }

            //
            // Library message from a completely unknown sender; lets just accept Connect
            //
            switch (tp)
            {
            case NetMessageType.Discovery:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryRequest))
                {
                    NetIncomingMessage dm = CreateIncomingMessage(NetIncomingMessageType.DiscoveryRequest, payloadByteLength);
                    if (payloadByteLength > 0)
                    {
                        Buffer.BlockCopy(m_receiveBuffer, ptr, dm.m_data, 0, payloadByteLength);
                    }
                    dm.m_bitLength      = payloadByteLength * 8;
                    dm.m_senderEndpoint = senderEndpoint;
                    ReleaseMessage(dm);
                }
                return;

            case NetMessageType.DiscoveryResponse:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.DiscoveryResponse))
                {
                    NetIncomingMessage dr = CreateIncomingMessage(NetIncomingMessageType.DiscoveryResponse, payloadByteLength);
                    if (payloadByteLength > 0)
                    {
                        Buffer.BlockCopy(m_receiveBuffer, ptr, dr.m_data, 0, payloadByteLength);
                    }
                    dr.m_bitLength      = payloadByteLength * 8;
                    dr.m_senderEndpoint = senderEndpoint;
                    ReleaseMessage(dr);
                }
                return;

            case NetMessageType.NatIntroduction:
                HandleNatIntroduction(ptr);
                return;

            case NetMessageType.NatPunchMessage:
                HandleNatPunch(ptr, senderEndpoint);
                return;

            case NetMessageType.Connect:
                // proceed
                break;

            case NetMessageType.Disconnect:
                // this is probably ok
                LogVerbose("Received Disconnect from unconnected source: " + senderEndpoint);
                return;

            default:
                LogWarning("Received unhandled library message " + tp + " from " + senderEndpoint);
                return;
            }

            // It's someone wanting to shake hands with us!

            int reservedSlots = m_handshakes.Count + m_connections.Count;

            if (reservedSlots >= m_configuration.m_maximumConnections)
            {
                // server full
                NetOutgoingMessage full = CreateMessage("Server full");
                full.m_messageType = NetMessageType.Disconnect;
                SendLibrary(full, senderEndpoint);
                return;
            }

            // Ok, start handshake!
            NetConnection conn = new NetConnection(this, senderEndpoint);

            m_handshakes.Add(senderEndpoint, conn);
            conn.ReceivedHandshake(tp, ptr, payloadByteLength);

            return;
        }
Exemple #6
0
        private void ReceivedUnconnectedLibraryMessage(double now, NetEndPoint senderEndPoint, long connectionId, NetMessageType tp, int ptr, int payloadByteLength)
        {
            NetConnection shake;

            if (m_handshakes.TryGetValue(connectionId, out shake))
            {
                shake.ReceivedHandshake(now, tp, ptr, payloadByteLength);
                return;
            }

            //
            // Library message from a completely unknown sender; lets just accept Connect
            //
            switch (tp)
            {
            case NetMessageType.Discovery:
                HandleIncomingDiscoveryRequest(now, senderEndPoint, ptr, payloadByteLength);
                return;

            case NetMessageType.DiscoveryResponse:
                HandleIncomingDiscoveryResponse(now, senderEndPoint, ptr, payloadByteLength);
                return;

            case NetMessageType.NatIntroduction:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
                {
                    HandleNatIntroduction(ptr);
                }
                return;

            case NetMessageType.NatPunchMessage:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
                {
                    HandleNatPunch(ptr, senderEndPoint);
                }
                return;

            case NetMessageType.NatIntroductionConfirmRequest:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
                {
                    HandleNatPunchConfirmRequest(ptr, senderEndPoint);
                }
                return;

            case NetMessageType.NatIntroductionConfirmed:
                if (m_configuration.IsMessageTypeEnabled(NetIncomingMessageType.NatIntroductionSuccess))
                {
                    HandleNatPunchConfirmed(ptr, senderEndPoint);
                }
                return;

            case NetMessageType.ConnectResponse:
                LogWarning("Received unhandled library message " + tp + " from " + senderEndPoint);
                return;

            case NetMessageType.Connect:
                if (m_configuration.AcceptIncomingConnections == false)
                {
                    LogWarning("Received Connect, but we're not accepting incoming connections!");
                    return;
                }
                // handle connect
                // It's someone wanting to shake hands with us!

                int reservedSlots = m_handshakes.Count + m_connections.Count;
                if (reservedSlots >= m_configuration.m_maximumConnections)
                {
                    // server full
                    NetOutgoingMessage full = CreateMessage("Server full");
                    full.m_messageType = NetMessageType.Disconnect;
                    SendLibrary(connectionId, full, senderEndPoint);
                    return;
                }

                if (connectionId == 0 || m_handshakes.ContainsKey(connectionId) || m_connectionLookup.ContainsKey(connectionId))
                {
                    // duplicate connection id
                    NetOutgoingMessage full = CreateMessage("Duplicate connection id");
                    full.m_messageType = NetMessageType.Disconnect;
                    SendLibrary(connectionId, full, senderEndPoint);
                    return;
                }

                // Ok, start handshake!
                NetConnection conn = new NetConnection(this, senderEndPoint, connectionId);
                conn.m_status = NetConnectionStatus.ReceivedInitiation;
                m_handshakes.Add(connectionId, conn);
                conn.ReceivedHandshake(now, tp, ptr, payloadByteLength);
                return;

            case NetMessageType.Disconnect:
                // this is probably ok
                LogVerbose("Received Disconnect from unconnected source: " + senderEndPoint);
                return;

            default:
                LogWarning("Received unhandled library message " + tp + " from " + senderEndPoint);
                return;
            }
        }