Esempio n. 1
0
        internal void DoSendDiscoveryRequest(
            IPEndPoint endPoint,
            bool useBroadcast,
            NetDiscoveryRequest request,
            float interval,
            float timeout)
        {
            if (!m_netBase.m_isBound)
                m_netBase.Start();

            if (request == null)
            {
                m_netBase.LogVerbose("Creating discovery request " + m_nextRequestNumber);
                request = new NetDiscoveryRequest(endPoint, m_nextRequestNumber++, useBroadcast, interval, timeout);
                if (m_requests == null)
                    m_requests = new List<NetDiscoveryRequest>();
                m_requests.Add(request);
            }

            string appIdent = m_netBase.m_config.ApplicationIdentifier;
            NetBuffer data = new NetBuffer(appIdent.Length + 8);

            // write app identifier
            data.Write(appIdent);

            // write netbase identifier to avoid self-discovery
            data.Write(m_netBase.m_randomIdentifier);

            // write request number
            data.Write((ushort)request.Number);

            m_netBase.LogWrite("Discovering " + endPoint.ToString() + "...");
            m_netBase.QueueSingleUnreliableSystemMessage(NetSystemType.Discovery, data, endPoint, useBroadcast);
        }
        /// <summary>
        /// Returns a NetMessage to return to application; or null if nothing
        /// </summary>
        internal IncomingNetMessage HandleResponse(
            IncomingNetMessage message,
            NetworkEndPoint endPoint
            )
        {
            if ((m_netBase.m_enabledMessageTypes & NetMessageType.ServerDiscovered) != NetMessageType.ServerDiscovered)
            {
                return(null);                // disabled
            }
            if (message.m_data == null || m_requests == null)
            {
                return(null);
            }

            ushort number = message.m_data.ReadUInt16();

            // find corresponding request
            NetDiscoveryRequest found = null;

            foreach (NetDiscoveryRequest request in m_requests)
            {
                if (request.Number == number)
                {
                    found = request;
                    break;
                }
            }

            if (found == null)
            {
                m_netBase.LogVerbose("Received discovery response to request " + number + " - unknown/old request!");
                return(null);                // Timed out request or not found
            }

            if (found.HasDiscovered(endPoint))
            {
                m_netBase.LogVerbose("Received discovery response to request " + number + " - previously known response!");
                return(null);                // Already discovered in this request, else stored it
            }

            m_netBase.LogVerbose("Received discovery response to request " + number + " - passing on to app...");

            IncomingNetMessage resMsg = m_netBase.CreateIncomingMessage();

            resMsg.m_msgType = NetMessageType.ServerDiscovered;

            // write sender, assume ipv4
            resMsg.m_data.Write(endPoint);

            return(resMsg);
        }
        internal void DoSendDiscoveryRequest(
            NetworkEndPoint endPoint,
            bool useBroadcast,
            NetDiscoveryRequest request,
            float interval,
            float timeout)
        {
            if (!m_netBase.m_isBound)
            {
                m_netBase.Start();
            }

            m_netBase.LogWrite("Discovery request to " + endPoint);

            if (request == null)
            {
                m_netBase.LogVerbose("Creating discovery request " + m_nextRequestNumber);
                request = new NetDiscoveryRequest(endPoint, m_nextRequestNumber++, useBroadcast, interval, timeout);
                if (m_requests == null)
                {
                    m_requests = new List <NetDiscoveryRequest>();
                }
                m_requests.Add(request);
            }

            string    appIdent = m_netBase.m_config.ApplicationIdentifier;
            NetBuffer data     = new NetBuffer(appIdent.Length + 8);

            // write app identifier
            data.Write(appIdent);

            // write netbase identifier to avoid self-discovery
            data.Write(m_netBase.m_localRndSignature);

            // write request number
            data.Write((ushort)request.Number);

            m_netBase.LogWrite("Discovering " + endPoint.ToString() + "...");
            m_netBase.QueueSingleUnreliableSystemMessage(NetSystemType.Discovery, data, endPoint, useBroadcast);
        }