private void DispatchCallBack_Which_IPv4(Answer answer, int errorCode) { if (requireClose) { AuthFinish(false, fpnn.ErrorCode.FPNN_EC_CORE_CONNECTION_CLOSED); return; } if (errorCode == fpnn.ErrorCode.FPNN_EC_OK) { if (!AdjustAuthRemainedTimeout()) { return; } string ipv4endpoint = answer.Get <string>("endpoint", string.Empty); if (ipv4endpoint.Length > 0) { TCPClient client = TCPClient.Create(ipv4endpoint, false); lock (interLocker) { rtmGate = client; authStatsInfo.rtmClients.Add(client); } ConfigRtmGateClient(client, (Int64 connectionId, string endpoint, bool connected) => { if (requireClose) { AuthFinish(false, fpnn.ErrorCode.FPNN_EC_CORE_CONNECTION_CLOSED); return; } if (connected) { rtmGateConnectionId = connectionId; lastAvailableRtmGateEndpoint = ipv4endpoint; RTMControlCenter.RegisterSession(rtmGateConnectionId, this); Auth(); } else { if (!AdjustAuthRemainedTimeout()) { return; } StartParallelConnect(ipv4endpoint); } }, authStatsInfo.remainedTimeout); client.AsyncConnect(); if (requireClose) { client.Close(); } return; } else { StartParallelConnect(string.Empty); } } else { AuthFinish(false, errorCode); } }
private void ParallelConnectToRtmGate(string endpoint, ParallelLoginStatusInfo info) { if (!AdjustAuthRemainedTimeout(info)) { DecreaseParallelConnectingCount(); return; } TCPClient client = TCPClient.Create(endpoint, false); lock (interLocker) { if (status != ClientStatus.Connecting) { return; } authStatsInfo.rtmClients.Add(client); } ConfigRtmGateClient(client, (Int64 connectionId, string rtmGateEndpoint, bool connected) => { if (requireClose) { DecreaseParallelConnectingCount(); return; } if (connected) { lock (interLocker) { if (status != ClientStatus.Connecting) { return; } authStatsInfo.parallelConnectingCount -= 1; if (authStatsInfo.parallelCompleted) { return; } authStatsInfo.parallelCompleted = true; authStatsInfo.remainedTimeout = info.remainedTimeout; authStatsInfo.lastActionMsecTimeStamp = info.lastActionMsecTimeStamp; rtmGate = client; } rtmGateConnectionId = connectionId; lastAvailableRtmGateEndpoint = endpoint; RTMControlCenter.RegisterSession(rtmGateConnectionId, this); Auth(); } else { DecreaseParallelConnectingCount(); } }, info.remainedTimeout); client.AsyncConnect(); if (requireClose) { client.Close(); } }
private bool Login(AuthDelegate callback, string token, Dictionary <string, string> attr, string lang = "", int timeout = 0) { lock (interLocker) { if (status == ClientStatus.Connected) { ClientEngine.RunTask(() => { callback(projectId, uid, true, fpnn.ErrorCode.FPNN_EC_OK); }); return(true); } if (status == ClientStatus.Connecting) { authStatsInfo.authDelegates.Add(callback); return(true); } status = ClientStatus.Connecting; syncConnectingEvent.Reset(); requireClose = false; if (autoReloginInfo != null) { autoReloginInfo.Login(); } } authStatsInfo = new AuthStatusInfo { authDelegates = new HashSet <AuthDelegate>() { callback }, remainedTimeout = timeout, }; authStatsInfo.token = token; authStatsInfo.attr = attr; authStatsInfo.lang = lang; authStatsInfo.lastActionMsecTimeStamp = ClientEngine.GetCurrentMilliseconds(); //if (rtmGate.IsConnected()) //{ // if (authStatsInfo.remainedTimeout == 0) // authStatsInfo.remainedTimeout = RTMConfig.globalQuestTimeoutSeconds; // RTMControlCenter.RegisterSession(rtmGateConnectionId, this); // Auth(false); //} //else { if (authStatsInfo.remainedTimeout == 0) { authStatsInfo.remainedTimeout = ((ConnectTimeout == 0) ? RTMConfig.globalConnectTimeoutSeconds : ConnectTimeout) + ((QuestTimeout == 0) ? RTMConfig.globalQuestTimeoutSeconds : QuestTimeout); } rtmGate.AsyncConnect(); } return(true); }