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); }
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; } }
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); }
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(); } }