HandleClientDisconnect() static private method

static private HandleClientDisconnect ( NetworkConnection conn ) : void
conn NetworkConnection
return void
        public bool ReconnectToNewHost(string serverIp, int serverPort)
        {
            if (!NetworkClient.active)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect - NetworkClient must be active");
                }
                return(false);
            }

            if (m_Connection == null)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect - no old connection exists");
                }
                return(false);
            }

            if (LogFilter.logInfo)
            {
                Debug.Log("NetworkClient Reconnect " + serverIp + ":" + serverPort);
            }

            ClientScene.HandleClientDisconnect(m_Connection);
            ClientScene.ClearLocalPlayers();

            m_Connection.Disconnect();
            m_Connection = null;
            m_ClientId   = m_UseRelay ? RelayTransport.AddHost(m_HostTopology, m_HostPort, false, RelayTransport.RelayAddress, RelayTransport.RelayPort) : NetworkTransport.AddHost(m_HostTopology, m_HostPort);

            string hostnameOrIp = serverIp;

            m_ServerPort = serverPort;

            //TODO: relay reconnect

            /*
             * if (Match.NetworkMatch.matchSingleton != null)
             * {
             *  hostnameOrIp = Match.NetworkMatch.matchSingleton.address;
             *  m_ServerPort = Match.NetworkMatch.matchSingleton.port;
             * }*/

            if (UnityEngine.Application.platform == RuntimePlatform.WebGLPlayer)
            {
                m_ServerIp     = hostnameOrIp;
                m_AsyncConnect = ConnectState.Resolved;
            }
            else if (serverIp.Equals("127.0.0.1") || serverIp.Equals("localhost"))
            {
                m_ServerIp     = "127.0.0.1";
                m_AsyncConnect = ConnectState.Resolved;
            }
            else
            {
                if (LogFilter.logDebug)
                {
                    Debug.Log("Async DNS START:" + hostnameOrIp);
                }
                m_AsyncConnect = ConnectState.Resolving;
                Dns.BeginGetHostAddresses(hostnameOrIp, new AsyncCallback(GetHostAddressesCallback), this);
            }
            return(true);
        }
        internal virtual void Update()
        {
            if (m_ClientId == -1)
            {
                return;
            }

            switch (m_AsyncConnect)
            {
            case ConnectState.None:
            case ConnectState.Resolving:
            case ConnectState.Disconnected:
                return;

            case ConnectState.Failed:
                GenerateConnectError((int)NetworkError.DNSFailure);
                m_AsyncConnect = ConnectState.Disconnected;
                return;

            case ConnectState.Resolved:
                m_AsyncConnect = ConnectState.Connecting;
                ContinueConnect();
                return;

            case ConnectState.Connecting:
            case ConnectState.Connected:
            {
                break;
            }
            }

            if (m_Connection != null)
            {
                if ((int)Time.time != m_StatResetTime)
                {
                    m_Connection.ResetStats();
                    m_StatResetTime = (int)Time.time;
                }
            }

            int numEvents = 0;
            NetworkEventType networkEvent;

            do
            {
                int  connectionId;
                int  channelId;
                int  receivedSize;
                byte error;

                networkEvent = m_UseRelay ? RelayTransport.ReceiveFromHost(m_ClientId, out connectionId, out channelId, m_MsgBuffer, (ushort)m_MsgBuffer.Length, out receivedSize, out error) : NetworkTransport.ReceiveFromHost(m_ClientId, out connectionId, out channelId, m_MsgBuffer, (ushort)m_MsgBuffer.Length, out receivedSize, out error);
                if (m_Connection != null)
                {
                    m_Connection.lastError = (NetworkError)error;
                }

                if (networkEvent != NetworkEventType.Nothing)
                {
                    if (LogFilter.logDev)
                    {
                        Debug.Log("Client event: host=" + m_ClientId + " event=" + networkEvent + " error=" + error);
                    }
                }

                switch (networkEvent)
                {
                case NetworkEventType.ConnectEvent:

                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client connected");
                    }

                    if (error != 0)
                    {
                        GenerateConnectError(error);
                        return;
                    }

                    m_AsyncConnect = ConnectState.Connected;
                    m_Connection.InvokeHandlerNoData(MsgType.Connect);
                    break;

                case NetworkEventType.DataEvent:
                    if (error != 0)
                    {
                        GenerateDataError(error);
                        return;
                    }

#if UNITY_EDITOR
                    UnityEditor.NetworkDetailStats.IncrementStat(
                        UnityEditor.NetworkDetailStats.NetworkDirection.Incoming,
                        MsgType.LLAPIMsg, "msg", 1);
#endif

                    m_MsgReader.SeekZero();
                    m_Connection.TransportReceive(m_MsgBuffer, receivedSize, channelId);
                    break;

                case NetworkEventType.DisconnectEvent:
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client disconnected");
                    }

                    m_AsyncConnect = ConnectState.Disconnected;

                    if (error != 0)
                    {
                        if ((NetworkError)error != NetworkError.Timeout)
                        {
                            GenerateDisconnectError(error);
                        }
                    }
                    ClientScene.HandleClientDisconnect(m_Connection);
                    if (m_Connection != null)
                    {
                        m_Connection.InvokeHandlerNoData(MsgType.Disconnect);
                    }
                    break;

                case NetworkEventType.Nothing:
                    break;

                default:
                    if (LogFilter.logError)
                    {
                        Debug.LogError("Unknown network message type received: " + networkEvent);
                    }
                    break;
                }

                if (++numEvents >= k_MaxEventsPerFrame)
                {
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("MaxEventsPerFrame hit (" + k_MaxEventsPerFrame + ")");
                    }
                    break;
                }
                if (m_ClientId == -1)
                {
                    break;
                }
            }while (networkEvent != NetworkEventType.Nothing);

            if (m_Connection != null && m_AsyncConnect == ConnectState.Connected)
            {
                m_Connection.FlushChannels();
            }
        }
        public bool ReconnectToNewHost(EndPoint secureTunnelEndPoint)
        {
            if (!NetworkClient.active)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect - NetworkClient must be active");
                }
                return(false);
            }

            if (m_Connection == null)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect - no old connection exists");
                }
                return(false);
            }

            if (LogFilter.logInfo)
            {
                Debug.Log("NetworkClient Reconnect to remoteSockAddr");
            }

            ClientScene.HandleClientDisconnect(m_Connection);
            ClientScene.ClearLocalPlayers();

            m_Connection.Disconnect();
            m_Connection = null;
            m_ClientId   = m_UseRelay ? RelayTransport.AddHost(m_HostTopology, m_HostPort, false) : NetworkTransport.AddHost(m_HostTopology, m_HostPort);

            if (secureTunnelEndPoint == null)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect failed: null endpoint passed in");
                }
                m_AsyncConnect = ConnectState.Failed;
                return(false);
            }

            // Make sure it's either IPv4 or IPv6
            if (secureTunnelEndPoint.AddressFamily != AddressFamily.InterNetwork && secureTunnelEndPoint.AddressFamily != AddressFamily.InterNetworkV6)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect failed: Endpoint AddressFamily must be either InterNetwork or InterNetworkV6");
                }
                m_AsyncConnect = ConnectState.Failed;
                return(false);
            }

            // Make sure it's an Endpoint we know what to do with
            string endPointType = secureTunnelEndPoint.GetType().FullName;

            if (endPointType == "System.Net.IPEndPoint")
            {
                IPEndPoint tmp = (IPEndPoint)secureTunnelEndPoint;
                Connect(tmp.Address.ToString(), tmp.Port);
                return(m_AsyncConnect != ConnectState.Failed);
            }
            if ((endPointType != "UnityEngine.XboxOne.XboxOneEndPoint") && (endPointType != "UnityEngine.PS4.SceEndPoint"))
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect failed: invalid Endpoint (not IPEndPoint or XboxOneEndPoint or SceEndPoint)");
                }
                m_AsyncConnect = ConnectState.Failed;
                return(false);
            }

            byte error = 0;

            // regular non-relay connect
            m_RemoteEndPoint = secureTunnelEndPoint;
            m_AsyncConnect   = ConnectState.Connecting;

            try
            {
                m_ClientConnectionId = m_UseRelay ? RelayTransport.ConnectEndPoint(m_ClientId, m_RemoteEndPoint, 0, out error) : NetworkTransport.ConnectEndPoint(m_ClientId, m_RemoteEndPoint, 0, out error);
            }
            catch (Exception ex)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect failed: Exception when trying to connect to EndPoint: " + ex);
                }
                m_AsyncConnect = ConnectState.Failed;
                return(false);
            }
            if (m_ClientConnectionId == 0)
            {
                if (LogFilter.logError)
                {
                    Debug.LogError("Reconnect failed: Unable to connect to EndPoint (" + error + ")");
                }
                m_AsyncConnect = ConnectState.Failed;
                return(false);
            }

            m_Connection = (NetworkConnection)Activator.CreateInstance(m_NetworkConnectionClass);
            m_Connection.SetHandlers(m_MessageHandlers);
            m_Connection.Initialize(m_ServerIp, m_ClientId, m_ClientConnectionId, m_HostTopology);
            return(true);
        }
Example #4
0
        internal virtual void Update()
        {
            if (this.m_ClientId == -1)
            {
                return;
            }
            switch (this.m_AsyncConnect)
            {
            case NetworkClient.ConnectState.None:
                break;

            case NetworkClient.ConnectState.Resolving:
                break;

            case NetworkClient.ConnectState.Resolved:
                this.m_AsyncConnect = NetworkClient.ConnectState.Connecting;
                this.ContinueConnect();
                break;

            case NetworkClient.ConnectState.Disconnected:
                break;

            case NetworkClient.ConnectState.Failed:
                this.GenerateConnectError(11);
                this.m_AsyncConnect = NetworkClient.ConnectState.Disconnected;
                break;

            default:
                if (this.m_Connection != null && (int)Time.time != this.m_StatResetTime)
                {
                    this.m_Connection.ResetStats();
                    this.m_StatResetTime = (int)Time.time;
                }
                NetworkEventType fromHost;
                do
                {
                    int  num1 = 0;
                    int  connectionId;
                    int  channelId;
                    int  receivedSize;
                    byte error;
                    fromHost = NetworkTransport.ReceiveFromHost(this.m_ClientId, out connectionId, out channelId, this.m_MsgBuffer, (int)(ushort)this.m_MsgBuffer.Length, out receivedSize, out error);
                    if (fromHost != NetworkEventType.Nothing && LogFilter.logDev)
                    {
                        Debug.Log((object)("Client event: host=" + (object)this.m_ClientId + " event=" + (object)fromHost + " error=" + (object)error));
                    }
                    switch (fromHost)
                    {
                    case NetworkEventType.DataEvent:
                        if ((int)error != 0)
                        {
                            this.GenerateDataError((int)error);
                            return;
                        }
                        NetworkDetailStats.IncrementStat(NetworkDetailStats.NetworkDirection.Incoming, (short)29, "msg", 1);
                        this.m_MsgReader.SeekZero();
                        this.m_Connection.TransportRecieve(this.m_MsgBuffer, receivedSize, channelId);
                        goto case NetworkEventType.Nothing;

                    case NetworkEventType.ConnectEvent:
                        if (LogFilter.logDebug)
                        {
                            Debug.Log((object)"Client connected");
                        }
                        if ((int)error != 0)
                        {
                            this.GenerateConnectError((int)error);
                            return;
                        }
                        this.m_AsyncConnect = NetworkClient.ConnectState.Connected;
                        this.m_Connection.InvokeHandlerNoData((short)32);
                        goto case NetworkEventType.Nothing;

                    case NetworkEventType.DisconnectEvent:
                        if (LogFilter.logDebug)
                        {
                            Debug.Log((object)"Client disconnected");
                        }
                        this.m_AsyncConnect = NetworkClient.ConnectState.Disconnected;
                        if ((int)error != 0 && (int)error != 6)
                        {
                            this.GenerateDisconnectError((int)error);
                        }
                        ClientScene.HandleClientDisconnect(this.m_Connection);
                        if (this.m_Connection != null)
                        {
                            this.m_Connection.InvokeHandlerNoData((short)33);
                            goto case NetworkEventType.Nothing;
                        }
                        else
                        {
                            goto case NetworkEventType.Nothing;
                        }

                    case NetworkEventType.Nothing:
                        int num2;
                        if ((num2 = num1 + 1) >= 500)
                        {
                            if (LogFilter.logDebug)
                            {
                                Debug.Log((object)("MaxEventsPerFrame hit (" + (object)500 + ")"));
                                goto label_34;
                            }
                            else
                            {
                                goto label_34;
                            }
                        }
                        else
                        {
                            continue;
                        }

                    default:
                        if (LogFilter.logError)
                        {
                            Debug.LogError((object)("Unknown network message type received: " + (object)fromHost));
                            goto case NetworkEventType.Nothing;
                        }
                        else
                        {
                            goto case NetworkEventType.Nothing;
                        }
                    }
                }while (this.m_ClientId != -1 && fromHost != NetworkEventType.Nothing);
label_34:
                if (this.m_Connection == null || this.m_AsyncConnect != NetworkClient.ConnectState.Connected)
                {
                    break;
                }
                this.m_Connection.FlushChannels();
                break;
            }
        }
Example #5
0
        internal virtual void Update()
        {
            if (m_ClientId == -1)
            {
                return;
            }

            switch (m_AsyncConnect)
            {
            case ConnectState.None:
            case ConnectState.Resolving:
            case ConnectState.Disconnected:
                return;

            case ConnectState.Failed:
                GenerateConnectError((int)NetworkError.DNSFailure);
                m_AsyncConnect = ConnectState.Disconnected;
                return;

            case ConnectState.Resolved:
                m_AsyncConnect = ConnectState.Connecting;
                ContinueConnect();
                return;

            case ConnectState.Connecting:
            case ConnectState.Connected:
            {
                break;
            }
            }

            int numEvents = 0;
            NetworkEventType networkEvent;

            do
            {
                int  connectionId;
                int  channelId;
                int  receivedSize;
                byte error;

                networkEvent = NetworkTransport.ReceiveFromHost(m_ClientId, out connectionId, out channelId, m_MsgBuffer, (ushort)m_MsgBuffer.Length, out receivedSize, out error);
                if (m_Connection != null)
                {
                    m_Connection.lastError = (NetworkError)error;
                }

                if (networkEvent != NetworkEventType.Nothing)
                {
                    if (LogFilter.logDev)
                    {
                        Debug.Log("Client event: host=" + m_ClientId + " event=" + networkEvent + " error=" + error);
                    }
                }

                switch (networkEvent)
                {
                case NetworkEventType.ConnectEvent:

                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client connected");
                    }

                    if (error != 0)
                    {
                        GenerateConnectError(error);
                        return;
                    }

                    m_AsyncConnect = ConnectState.Connected;
                    m_Connection.InvokeHandlerNoData((short)MsgType.Connect);
                    break;

                case NetworkEventType.DataEvent:
                    if (error != 0)
                    {
                        GenerateDataError(error);
                        return;
                    }

#if UNITY_EDITOR
                    UnityEditor.NetworkDetailStats.IncrementStat(
                        UnityEditor.NetworkDetailStats.NetworkDirection.Incoming,
                        (short)MsgType.LLAPIMsg, "msg", 1);
#endif
                    // create a buffer with exactly 'receivedSize' size for the handlers so we don't need to read
                    // a size header (saves bandwidth)
                    byte[] data = new byte[receivedSize];
                    Array.Copy(m_MsgBuffer, data, receivedSize);

                    m_Connection.TransportReceive(data, channelId);
                    break;

                case NetworkEventType.DisconnectEvent:
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client disconnected");
                    }

                    m_AsyncConnect = ConnectState.Disconnected;

                    if (error != 0)
                    {
                        if ((NetworkError)error != NetworkError.Timeout)
                        {
                            GenerateDisconnectError(error);
                        }
                    }
                    ClientScene.HandleClientDisconnect(m_Connection);
                    if (m_Connection != null)
                    {
                        m_Connection.InvokeHandlerNoData((short)MsgType.Disconnect);
                    }
                    break;

                case NetworkEventType.Nothing:
                    break;

                default:
                    if (LogFilter.logError)
                    {
                        Debug.LogError("Unknown network message type received: " + networkEvent);
                    }
                    break;
                }

                if (++numEvents >= k_MaxEventsPerFrame)
                {
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("MaxEventsPerFrame hit (" + k_MaxEventsPerFrame + ")");
                    }
                    break;
                }
                if (m_ClientId == -1)
                {
                    break;
                }
            }while (networkEvent != NetworkEventType.Nothing);
        }
Example #6
0
        internal virtual void Update()
        {
            if (this.m_ClientId == -1)
            {
                return;
            }
            switch (this.m_AsyncConnect)
            {
            case NetworkClient.ConnectState.None:
            case NetworkClient.ConnectState.Resolving:
            case NetworkClient.ConnectState.Disconnected:
                return;

            case NetworkClient.ConnectState.Resolved:
                this.m_AsyncConnect = NetworkClient.ConnectState.Connecting;
                this.ContinueConnect();
                return;

            case NetworkClient.ConnectState.Failed:
                this.GenerateConnectError(11);
                this.m_AsyncConnect = NetworkClient.ConnectState.Disconnected;
                return;
            }
            if (this.m_Connection != null && (int)Time.time != this.m_StatResetTime)
            {
                this.m_Connection.ResetStats();
                this.m_StatResetTime = (int)Time.time;
            }
            byte b;

            while (true)
            {
                int num = 0;
                int num2;
                int channelId;
                int numBytes;
                NetworkEventType networkEventType = NetworkTransport.ReceiveFromHost(this.m_ClientId, out num2, out channelId, this.m_MsgBuffer, (int)((ushort)this.m_MsgBuffer.Length), out numBytes, out b);
                if (networkEventType != NetworkEventType.Nothing && LogFilter.logDev)
                {
                    Debug.Log(string.Concat(new object[]
                    {
                        "Client event: host=",
                        this.m_ClientId,
                        " event=",
                        networkEventType,
                        " error=",
                        b
                    }));
                }
                switch (networkEventType)
                {
                case NetworkEventType.DataEvent:
                    if (b != 0)
                    {
                        goto Block_10;
                    }
                    this.m_MsgReader.SeekZero();
                    this.m_Connection.TransportRecieve(this.m_MsgBuffer, numBytes, channelId);
                    break;

                case NetworkEventType.ConnectEvent:
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client connected");
                    }
                    if (b != 0)
                    {
                        goto Block_9;
                    }
                    this.m_AsyncConnect = NetworkClient.ConnectState.Connected;
                    this.m_Connection.InvokeHandlerNoData(32);
                    break;

                case NetworkEventType.DisconnectEvent:
                    if (LogFilter.logDebug)
                    {
                        Debug.Log("Client disconnected");
                    }
                    this.m_AsyncConnect = NetworkClient.ConnectState.Disconnected;
                    if (b != 0)
                    {
                        this.GenerateDisconnectError((int)b);
                    }
                    ClientScene.HandleClientDisconnect(this.m_Connection);
                    this.m_Connection.InvokeHandlerNoData(33);
                    break;

                case NetworkEventType.Nothing:
                    break;

                default:
                    if (LogFilter.logError)
                    {
                        Debug.LogError("Unknown network message type received: " + networkEventType);
                    }
                    break;
                }
                if (num + 1 >= 500)
                {
                    goto Block_14;
                }
                if (this.m_ClientId == -1)
                {
                    goto Block_16;
                }
                if (networkEventType == NetworkEventType.Nothing)
                {
                    goto IL_26B;
                }
            }
Block_9:
            this.GenerateConnectError((int)b);
            return;

Block_10:
            this.GenerateDataError((int)b);
            return;

Block_14:
            if (LogFilter.logDebug)
            {
                Debug.Log("MaxEventsPerFrame hit (" + 500 + ")");
            }
Block_16:
IL_26B:
            if (this.m_Connection != null && this.m_AsyncConnect == NetworkClient.ConnectState.Connected)
            {
                this.m_Connection.FlushChannels();
            }
        }