RouterCheckComponentSystem.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Net;
  3. namespace ET.Client
  4. {
  5. [ObjectSystem]
  6. public class RouterCheckComponentAwakeSystem: AwakeSystem<RouterCheckComponent>
  7. {
  8. public override void Awake(RouterCheckComponent self)
  9. {
  10. CheckAsync(self).Coroutine();
  11. }
  12. private static async ETTask CheckAsync(RouterCheckComponent self)
  13. {
  14. Session session = self.GetParent<Session>();
  15. long instanceId = self.InstanceId;
  16. while (true)
  17. {
  18. if (self.InstanceId != instanceId)
  19. {
  20. return;
  21. }
  22. await TimerComponent.Instance.WaitAsync(1000);
  23. if (self.InstanceId != instanceId)
  24. {
  25. return;
  26. }
  27. long time = TimeHelper.ClientFrameTime();
  28. if (time - session.LastRecvTime < 7 * 1000)
  29. {
  30. continue;
  31. }
  32. try
  33. {
  34. long sessionId = session.Id;
  35. uint localConn = 0;
  36. uint remoteConn = 0;
  37. KService service = session.AService as KService;
  38. KChannel kChannel = service.Get(sessionId);
  39. if (kChannel == null)
  40. {
  41. Log.Warning($"not found remoteConn: {sessionId}");
  42. continue;
  43. }
  44. localConn = kChannel.LocalConn;
  45. remoteConn = kChannel.RemoteConn;
  46. string realAddress = self.GetParent<Session>().RemoteAddress.ToString();
  47. Log.Info($"get recvLocalConn start: {self.ZoneScene().Id} {realAddress} {localConn} {remoteConn}");
  48. (uint recvLocalConn, string routerAddress) = await RouterHelper.GetRouterAddress(self.ZoneScene(), realAddress, localConn, remoteConn);
  49. if (recvLocalConn == 0)
  50. {
  51. Log.Error($"get recvLocalConn fail: {self.ZoneScene().Id} {routerAddress} {realAddress} {localConn} {remoteConn}");
  52. continue;
  53. }
  54. Log.Info($"get recvLocalConn ok: {self.ZoneScene().Id} {routerAddress} {realAddress} {recvLocalConn} {localConn} {remoteConn}");
  55. session.LastRecvTime = TimeHelper.ClientNow();
  56. IPEndPoint remoteAddress = NetworkHelper.ToIPEndPoint(routerAddress);
  57. ((KService)session.AService).ChangeAddress(sessionId, remoteAddress);
  58. }
  59. catch (Exception e)
  60. {
  61. Log.Error(e);
  62. }
  63. }
  64. }
  65. }
  66. }