Lidgren.Network.NetConnection.ReceivedHandshake C# (CSharp) Method

ReceivedHandshake() private method

private ReceivedHandshake ( double now, NetMessageType tp, int ptr, int payloadLength ) : void
now double
tp NetMessageType
ptr int
payloadLength int
return void
        internal void ReceivedHandshake(double now, NetMessageType tp, int ptr, int payloadLength)
        {
            m_peer.VerifyNetworkThread();

            byte[] hail;
            switch (tp)
            {
                case NetMessageType.Connect:
                    if (m_status == NetConnectionStatus.ReceivedInitiation)
                    {
                        // Whee! Server full has already been checked
                        bool ok = ValidateHandshakeData(ptr, payloadLength, out hail);
                        if (ok)
                        {
                            if (hail != null)
                            {
                                m_remoteHailMessage = m_peer.CreateIncomingMessage(NetIncomingMessageType.Data, hail);
                                m_remoteHailMessage.LengthBits = (hail.Length * 8);
                            }
                            else
                            {
                                m_remoteHailMessage = null;
                            }

                            if (m_peerConfiguration.IsMessageTypeEnabled(NetIncomingMessageType.ConnectionApproval))
                            {
                                // ok, let's not add connection just yet
                                NetIncomingMessage appMsg = m_peer.CreateIncomingMessage(NetIncomingMessageType.ConnectionApproval, (m_remoteHailMessage == null ? 0 : m_remoteHailMessage.LengthBytes));
                                appMsg.m_receiveTime = now;
                                appMsg.m_senderConnection = this;
                                appMsg.m_senderEndPoint = this.m_remoteEndPoint;
                                if (m_remoteHailMessage != null)
                                    appMsg.Write(m_remoteHailMessage.m_data, 0, m_remoteHailMessage.LengthBytes);
                                SetStatus(NetConnectionStatus.RespondedAwaitingApproval, "Awaiting approval");
                                m_peer.ReleaseMessage(appMsg);
                                return;
                            }

                            SendConnectResponse((float)now, true);
                        }
                        return;
                    }
                    if (m_status == NetConnectionStatus.RespondedAwaitingApproval)
                    {
                        m_peer.LogWarning("Ignoring multiple Connect() most likely due to a delayed Approval");
                        return;
                    }
                    if (m_status == NetConnectionStatus.RespondedConnect)
                    {
                        // our ConnectResponse must have been lost
                        SendConnectResponse((float)now, true);
                        return;
                    }
                    m_peer.LogDebug("Unhandled Connect: " + tp + ", status is " + m_status + " length: " + payloadLength);
                    break;
                case NetMessageType.ConnectResponse:
                    HandleConnectResponse(now, tp, ptr, payloadLength);
                    break;

                case NetMessageType.ConnectionEstablished:
                    switch (m_status)
                    {
                        case NetConnectionStatus.Connected:
                            // ok...
                            break;
                        case NetConnectionStatus.Disconnected:
                        case NetConnectionStatus.Disconnecting:
                        case NetConnectionStatus.None:
                            // too bad, almost made it
                            break;
                        case NetConnectionStatus.ReceivedInitiation:
                            // uh, a little premature... ignore
                            break;
                        case NetConnectionStatus.InitiatedConnect:
                            // weird, should have been RespondedConnect...
                            break;
                        case NetConnectionStatus.RespondedConnect:
                            // awesome

                            NetIncomingMessage msg = m_peer.SetupReadHelperMessage(ptr, payloadLength);
                            InitializeRemoteTimeOffset(msg.ReadSingle());

                            m_peer.AcceptConnection(this);
                            InitializePing();
                            SetStatus(NetConnectionStatus.Connected, "Connected to " + NetUtility.ToHexString(m_remoteUniqueIdentifier));
                            return;
                    }
                    break;

                case NetMessageType.Disconnect:
                    // ouch
                    string reason = "Ouch";
                    try
                    {
                        NetIncomingMessage inc = m_peer.SetupReadHelperMessage(ptr, payloadLength);
                        reason = inc.ReadString();
                    }
                    catch
                    {
                    }
                    ExecuteDisconnect(reason, false);
                    break;

                case NetMessageType.Discovery:
                    m_peer.HandleIncomingDiscoveryRequest(now, m_remoteEndPoint, ptr, payloadLength);
                    return;

                case NetMessageType.DiscoveryResponse:
                    m_peer.HandleIncomingDiscoveryResponse(now, m_remoteEndPoint, ptr, payloadLength);
                    return;

                case NetMessageType.Ping:
                    // silently ignore
                    return;

                default:
                    m_peer.LogDebug("Unhandled type during handshake: " + tp + " length: " + payloadLength);
                    break;
            }
        }

Usage Example

		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;
		}
All Usage Examples Of Lidgren.Network.NetConnection::ReceivedHandshake