RouterComponentSystem.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. using System;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Runtime.InteropServices;
  5. namespace ET.Server
  6. {
  7. [EntitySystemOf(typeof(RouterComponent))]
  8. [FriendOf(typeof (RouterNode))]
  9. public static partial class RouterComponentSystem
  10. {
  11. [EntitySystem]
  12. private static void Awake(this RouterComponent self, IPEndPoint outerAddress, string innerIP)
  13. {
  14. self.OuterUdp = new UdpTransport(outerAddress);
  15. self.OuterTcp = new TcpTransport(outerAddress);
  16. self.InnerSocket = new UdpTransport(new IPEndPoint(IPAddress.Parse(innerIP), 0));
  17. }
  18. [EntitySystem]
  19. private static void Destroy(this RouterComponent self)
  20. {
  21. self.OuterUdp.Dispose();
  22. self.OuterTcp.Dispose();
  23. self.InnerSocket.Dispose();
  24. self.IPEndPoint = null;
  25. }
  26. [EntitySystem]
  27. private static void Update(this RouterComponent self)
  28. {
  29. self.OuterUdp.Update();
  30. self.OuterTcp.Update();
  31. self.InnerSocket.Update();
  32. long timeNow = TimeInfo.Instance.ClientNow();
  33. self.RecvOuterUdp(timeNow);
  34. self.RecvOuterTcp(timeNow);
  35. self.RecvInner(timeNow);
  36. // 每秒钟检查一次
  37. if (timeNow - self.LastCheckTime > 1000)
  38. {
  39. self.CheckConnectTimeout(timeNow);
  40. self.LastCheckTime = timeNow;
  41. }
  42. }
  43. private static IPEndPoint CloneAddress(this RouterComponent self)
  44. {
  45. IPEndPoint ipEndPoint = (IPEndPoint) self.IPEndPoint;
  46. return new IPEndPoint(ipEndPoint.Address, ipEndPoint.Port);
  47. }
  48. // 接收tcp消息
  49. private static void RecvOuterTcp(this RouterComponent self, long timeNow)
  50. {
  51. while (self.OuterTcp != null && self.OuterTcp.Available() > 0)
  52. {
  53. try
  54. {
  55. int messageLength = self.OuterTcp.Recv(self.Cache, ref self.IPEndPoint);
  56. self.RecvOuterHandler(messageLength, timeNow, self.OuterTcp);
  57. }
  58. catch (Exception e)
  59. {
  60. Log.Error(e);
  61. }
  62. }
  63. }
  64. // 接收udp消息
  65. private static void RecvOuterUdp(this RouterComponent self, long timeNow)
  66. {
  67. while (self.OuterUdp != null && self.OuterUdp.Available() > 0)
  68. {
  69. try
  70. {
  71. int messageLength = self.OuterUdp.Recv(self.Cache, ref self.IPEndPoint);
  72. self.RecvOuterHandler(messageLength, timeNow, self.OuterUdp);
  73. }
  74. catch (Exception e)
  75. {
  76. Log.Error(e);
  77. }
  78. }
  79. }
  80. private static void CheckConnectTimeout(this RouterComponent self, long timeNow)
  81. {
  82. int n = self.checkTimeout.Count < 10? self.checkTimeout.Count : 10;
  83. for (int i = 0; i < n; ++i)
  84. {
  85. uint id = self.checkTimeout.Dequeue();
  86. RouterNode node = self.GetChild<RouterNode>(id);
  87. if (node == null)
  88. {
  89. continue;
  90. }
  91. // 已经连接上了
  92. switch (node.Status)
  93. {
  94. case RouterStatus.Sync:
  95. // 超时了
  96. if (timeNow > node.LastRecvOuterTime + 10 * 1000)
  97. {
  98. self.OnError(id, ErrorCore.ERR_KcpRouterConnectFail);
  99. continue;
  100. }
  101. break;
  102. case RouterStatus.Msg:
  103. // 比session超时应该多10秒钟
  104. if (timeNow > node.LastRecvOuterTime + ConstValue.SessionTimeoutTime + 10 * 1000)
  105. {
  106. self.OnError(id, ErrorCore.ERR_KcpRouterTimeout);
  107. continue;
  108. }
  109. break;
  110. default:
  111. throw new ArgumentOutOfRangeException();
  112. }
  113. self.checkTimeout.Enqueue(id);
  114. }
  115. }
  116. private static void RecvInner(this RouterComponent self, long timeNow)
  117. {
  118. while (self.InnerSocket != null && self.InnerSocket.Available() > 0)
  119. {
  120. try
  121. {
  122. int messageLength = self.InnerSocket.Recv(self.Cache, ref self.IPEndPoint);
  123. self.RecvInnerHandler(messageLength, timeNow);
  124. }
  125. catch (Exception e)
  126. {
  127. Log.Error(e);
  128. }
  129. }
  130. }
  131. private static void RecvOuterHandler(this RouterComponent self, int messageLength, long timeNow, IKcpTransport transport)
  132. {
  133. // 长度小于1,不是正常的消息
  134. if (messageLength < 1)
  135. {
  136. return;
  137. }
  138. // accept
  139. byte flag = self.Cache[0];
  140. switch (flag)
  141. {
  142. case KcpProtocalType.RouterReconnectSYN:
  143. {
  144. if (messageLength < 13)
  145. {
  146. break;
  147. }
  148. uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
  149. uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
  150. uint connectId = BitConverter.ToUInt32(self.Cache, 9);
  151. string realAddress = self.Cache.ToStr(13, messageLength - 13);
  152. // RouterAck之后ConnectIdNodes会删除,加入到OuterNodes中来
  153. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  154. if (routerNode == null)
  155. {
  156. Log.Info($"router create reconnect: {self.IPEndPoint} {realAddress} {outerConn} {innerConn}");
  157. routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
  158. }
  159. // 不是自己的,outerConn冲突, 直接break,也就是说这个软路由上有个跟自己outerConn冲突的连接,就不能连接了
  160. // 这个路由连接不上,客户端会换个软路由,所以没关系
  161. if (routerNode.InnerConn != innerConn)
  162. {
  163. Log.Warning($"kcp router router reconnect inner conn diff1: {routerNode.SyncIpEndPoint} {(IPEndPoint) self.IPEndPoint}");
  164. break;
  165. }
  166. if (routerNode.OuterConn != outerConn)
  167. {
  168. Log.Warning($"kcp router router reconnect outer conn diff1: {routerNode.SyncIpEndPoint} {(IPEndPoint) self.IPEndPoint}");
  169. break;
  170. }
  171. // reconnect检查了InnerConn跟OuterConn,到这里肯定保证了是同一客户端, 如果connectid不一样,证明是两次不同的连接,可以删除老的连接
  172. if (routerNode.ConnectId != connectId)
  173. {
  174. Log.Warning($"kcp router router reconnect connectId diff, maybe router count too less: {connectId} {routerNode.ConnectId} {routerNode.SyncIpEndPoint} {(IPEndPoint) self.IPEndPoint}");
  175. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterSame);
  176. break;
  177. }
  178. // 校验内网地址
  179. if (routerNode.InnerAddress != realAddress)
  180. {
  181. Log.Warning($"router sync error2: {routerNode.OuterConn} {routerNode.InnerAddress} {outerConn} {realAddress}");
  182. break;
  183. }
  184. if (++routerNode.RouterSyncCount > 40)
  185. {
  186. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterRouterSyncCountTooMuchTimes);
  187. break;
  188. }
  189. routerNode.KcpTransport = transport;
  190. // 转发到内网
  191. self.Cache.WriteTo(0, KcpProtocalType.RouterReconnectSYN);
  192. self.Cache.WriteTo(1, outerConn);
  193. self.Cache.WriteTo(5, innerConn);
  194. self.InnerSocket.Send(self.Cache, 0, 9, routerNode.InnerIpEndPoint);
  195. if (!routerNode.CheckOuterCount(timeNow))
  196. {
  197. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterTooManyPackets);
  198. }
  199. break;
  200. }
  201. case KcpProtocalType.RouterSYN:
  202. {
  203. if (messageLength < 13)
  204. {
  205. break;
  206. }
  207. uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
  208. uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
  209. uint connectId = BitConverter.ToUInt32(self.Cache, 9);
  210. string realAddress = self.Cache.ToStr(13, messageLength - 13);
  211. // innerconn会在ack的时候赋值,所以routersync过程绝对是routerNode.InnerConn绝对是0
  212. if (innerConn != 0)
  213. {
  214. Log.Warning($"kcp router syn status innerConn != 0: {outerConn} {innerConn}");
  215. break;
  216. }
  217. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  218. if (routerNode == null)
  219. {
  220. routerNode = self.New(realAddress, outerConn, innerConn, connectId, self.CloneAddress());
  221. Log.Info($"router create: {realAddress} {outerConn} {innerConn} {routerNode.SyncIpEndPoint}");
  222. }
  223. if (routerNode.Status != RouterStatus.Sync)
  224. {
  225. Log.Warning($"kcp router syn status error: {outerConn} {innerConn} {routerNode.InnerConn}");
  226. break;
  227. }
  228. // innerconn会在ack的时候赋值,所以routersync过程绝对是routerNode.InnerConn绝对是0
  229. if (routerNode.InnerConn != innerConn)
  230. {
  231. Log.Warning($"kcp router syn status InnerConn != 0: {outerConn} {innerConn} {routerNode.InnerConn}");
  232. break;
  233. }
  234. if (++routerNode.RouterSyncCount > 40)
  235. {
  236. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterRouterSyncCountTooMuchTimes);
  237. break;
  238. }
  239. // 这里可以注释,因增加了connectid的检查,第三方很难通过检查
  240. // 校验ip,连接过程中ip不能变化
  241. //if (!Equals(routerNode.SyncIpEndPoint, self.IPEndPoint))
  242. //{
  243. // Log.Warning($"kcp router syn ip is diff1: {routerNode.SyncIpEndPoint} {self.IPEndPoint}");
  244. // break;
  245. //}
  246. // 这里因为InnerConn是0,无法保证连接是同一客户端发过来的,所以这里如果connectid不同,则break。注意逻辑跟reconnect不一样
  247. if (routerNode.ConnectId != connectId)
  248. {
  249. Log.Warning($"kcp router router connect connectId diff, maybe router count too less: {connectId} {routerNode.ConnectId} {routerNode.SyncIpEndPoint} {(IPEndPoint) self.IPEndPoint}");
  250. break;
  251. }
  252. // 校验内网地址
  253. if (routerNode.InnerAddress != realAddress)
  254. {
  255. Log.Warning($"router sync error2: {routerNode.OuterConn} {routerNode.InnerAddress} {outerConn} {realAddress}");
  256. break;
  257. }
  258. routerNode.KcpTransport = transport;
  259. self.Cache.WriteTo(0, KcpProtocalType.RouterACK);
  260. self.Cache.WriteTo(1, routerNode.InnerConn);
  261. self.Cache.WriteTo(5, routerNode.OuterConn);
  262. routerNode.KcpTransport.Send(self.Cache, 0, 9, routerNode.SyncIpEndPoint);
  263. if (!routerNode.CheckOuterCount(timeNow))
  264. {
  265. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterTooManyPackets);
  266. }
  267. break;
  268. }
  269. case KcpProtocalType.SYN:
  270. {
  271. // 长度!=13,不是accpet消息
  272. if (messageLength != 9)
  273. {
  274. break;
  275. }
  276. uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
  277. uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
  278. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  279. if (routerNode == null)
  280. {
  281. Log.Warning($"kcp router syn not found outer nodes: {outerConn} {innerConn}");
  282. break;
  283. }
  284. if (++routerNode.SyncCount > 20)
  285. {
  286. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterSyncCountTooMuchTimes);
  287. break;
  288. }
  289. // 校验ip,连接过程中ip不能变化
  290. IPEndPoint ipEndPoint = (IPEndPoint) self.IPEndPoint;
  291. if (!Equals(routerNode.SyncIpEndPoint.Address, ipEndPoint.Address))
  292. {
  293. Log.Warning($"kcp router syn ip is diff3: {routerNode.SyncIpEndPoint.Address} {ipEndPoint.Address}");
  294. break;
  295. }
  296. routerNode.KcpTransport = transport;
  297. routerNode.LastRecvOuterTime = timeNow;
  298. routerNode.OuterIpEndPoint = self.CloneAddress();
  299. // 转发到内网, 带上客户端的地址
  300. self.Cache.WriteTo(0, KcpProtocalType.SYN);
  301. self.Cache.WriteTo(1, outerConn);
  302. self.Cache.WriteTo(5, innerConn);
  303. byte[] addressBytes = ipEndPoint.ToString().ToByteArray();
  304. Array.Copy(addressBytes, 0, self.Cache, 9, addressBytes.Length);
  305. Log.Info($"kcp router syn: {outerConn} {innerConn} {routerNode.InnerIpEndPoint} {routerNode.OuterIpEndPoint}");
  306. self.InnerSocket.Send(self.Cache, 0, 9 + addressBytes.Length, routerNode.InnerIpEndPoint);
  307. if (!routerNode.CheckOuterCount(timeNow))
  308. {
  309. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterTooManyPackets);
  310. }
  311. break;
  312. }
  313. case KcpProtocalType.FIN: // 断开
  314. {
  315. // 长度!=13,不是DisConnect消息
  316. if (messageLength != 13)
  317. {
  318. break;
  319. }
  320. uint outerConn = BitConverter.ToUInt32(self.Cache, 1);
  321. uint innerConn = BitConverter.ToUInt32(self.Cache, 5);
  322. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  323. if (routerNode == null)
  324. {
  325. Log.Warning($"kcp router outer fin not found outer nodes: {outerConn} {innerConn}");
  326. break;
  327. }
  328. // 比对innerConn
  329. if (routerNode.InnerConn != innerConn)
  330. {
  331. Log.Warning($"router node innerConn error: {innerConn} {outerConn} {routerNode.Status}");
  332. break;
  333. }
  334. routerNode.KcpTransport = transport;
  335. routerNode.LastRecvOuterTime = timeNow;
  336. Log.Info($"kcp router outer fin: {outerConn} {innerConn} {routerNode.InnerIpEndPoint}");
  337. self.InnerSocket.Send(self.Cache, 0, messageLength, routerNode.InnerIpEndPoint);
  338. if (!routerNode.CheckOuterCount(timeNow))
  339. {
  340. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterTooManyPackets);
  341. }
  342. break;
  343. }
  344. case KcpProtocalType.MSG:
  345. {
  346. // 长度<9,不是Msg消息
  347. if (messageLength < 9)
  348. {
  349. break;
  350. }
  351. // 处理chanel
  352. uint outerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
  353. uint innerConn = BitConverter.ToUInt32(self.Cache, 5); // local
  354. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  355. if (routerNode == null)
  356. {
  357. Log.Warning($"kcp router msg not found outer nodes: {outerConn} {innerConn}");
  358. break;
  359. }
  360. if (routerNode.Status != RouterStatus.Msg)
  361. {
  362. Log.Warning($"router node status error: {innerConn} {outerConn} {routerNode.Status}");
  363. break;
  364. }
  365. // 比对innerConn
  366. if (routerNode.InnerConn != innerConn)
  367. {
  368. Log.Warning($"router node innerConn error: {innerConn} {outerConn} {routerNode.Status}");
  369. break;
  370. }
  371. // 重连的时候,没有经过syn阶段,可能没有设置OuterIpEndPoint,重连请求Router的Socket跟发送消息的Socket不是同一个,所以udp出来的公网地址可能会变化
  372. if (!Equals(routerNode.OuterIpEndPoint, self.IPEndPoint))
  373. {
  374. routerNode.OuterIpEndPoint = self.CloneAddress();
  375. }
  376. routerNode.KcpTransport = transport;
  377. routerNode.LastRecvOuterTime = timeNow;
  378. self.InnerSocket.Send(self.Cache, 0, messageLength, routerNode.InnerIpEndPoint);
  379. if (!routerNode.CheckOuterCount(timeNow))
  380. {
  381. self.OnError(routerNode.Id, ErrorCore.ERR_KcpRouterTooManyPackets);
  382. }
  383. break;
  384. }
  385. }
  386. }
  387. private static void RecvInnerHandler(this RouterComponent self, int messageLength, long timeNow)
  388. {
  389. // 长度小于1,不是正常的消息
  390. if (messageLength < 1)
  391. {
  392. return;
  393. }
  394. // accept
  395. byte flag = self.Cache[0];
  396. switch (flag)
  397. {
  398. case KcpProtocalType.RouterReconnectACK:
  399. {
  400. uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
  401. uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
  402. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  403. if (routerNode == null)
  404. {
  405. Log.Warning($"router node error: {innerConn} {outerConn}");
  406. break;
  407. }
  408. // 必须校验innerConn,防止伪造
  409. if (innerConn != routerNode.InnerConn)
  410. {
  411. Log.Warning(
  412. $"router node innerConn error: {innerConn} {routerNode.InnerConn} {outerConn} {routerNode.OuterConn} {routerNode.Status}");
  413. break;
  414. }
  415. // 必须校验outerConn,防止伪造
  416. if (outerConn != routerNode.OuterConn)
  417. {
  418. Log.Warning(
  419. $"router node outerConn error: {innerConn} {routerNode.InnerConn} {outerConn} {routerNode.OuterConn} {routerNode.Status}");
  420. break;
  421. }
  422. routerNode.Status = RouterStatus.Msg;
  423. routerNode.LastRecvInnerTime = timeNow;
  424. // 转发出去
  425. self.Cache.WriteTo(0, KcpProtocalType.RouterReconnectACK);
  426. self.Cache.WriteTo(1, routerNode.InnerConn);
  427. self.Cache.WriteTo(5, routerNode.OuterConn);
  428. Log.Info($"kcp router RouterAck: {outerConn} {innerConn} {routerNode.SyncIpEndPoint}");
  429. routerNode.KcpTransport.Send(self.Cache, 0, 9, routerNode.SyncIpEndPoint);
  430. break;
  431. }
  432. case KcpProtocalType.ACK:
  433. {
  434. uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
  435. uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
  436. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  437. if (routerNode == null)
  438. {
  439. Log.Warning($"kcp router ack not found outer nodes: {outerConn} {innerConn}");
  440. break;
  441. }
  442. routerNode.Status = RouterStatus.Msg;
  443. routerNode.InnerConn = innerConn;
  444. routerNode.LastRecvInnerTime = timeNow;
  445. // 转发出去
  446. Log.Info($"kcp router ack: {outerConn} {innerConn} {routerNode.OuterIpEndPoint}");
  447. routerNode.KcpTransport.Send(self.Cache, 0, messageLength, routerNode.OuterIpEndPoint);
  448. break;
  449. }
  450. case KcpProtocalType.FIN: // 断开
  451. {
  452. // 长度!=13,不是DisConnect消息
  453. if (messageLength != 13)
  454. {
  455. break;
  456. }
  457. uint innerConn = BitConverter.ToUInt32(self.Cache, 1);
  458. uint outerConn = BitConverter.ToUInt32(self.Cache, 5);
  459. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  460. if (routerNode == null)
  461. {
  462. Log.Warning($"kcp router inner fin not found outer nodes: {outerConn} {innerConn}");
  463. break;
  464. }
  465. // 比对innerConn
  466. if (routerNode.InnerConn != innerConn)
  467. {
  468. Log.Warning($"router node innerConn error: {innerConn} {outerConn} {routerNode.Status}");
  469. break;
  470. }
  471. // 重连,这个字段可能为空,需要客户端发送消息上来才能设置
  472. if (routerNode.OuterIpEndPoint == null)
  473. {
  474. break;
  475. }
  476. routerNode.LastRecvInnerTime = timeNow;
  477. Log.Info($"kcp router inner fin: {outerConn} {innerConn} {routerNode.OuterIpEndPoint}");
  478. routerNode.KcpTransport.Send(self.Cache, 0, messageLength, routerNode.OuterIpEndPoint);
  479. break;
  480. }
  481. case KcpProtocalType.MSG:
  482. {
  483. // 长度<9,不是Msg消息
  484. if (messageLength < 9)
  485. {
  486. break;
  487. }
  488. // 处理chanel
  489. uint innerConn = BitConverter.ToUInt32(self.Cache, 1); // remote
  490. uint outerConn = BitConverter.ToUInt32(self.Cache, 5); // local
  491. RouterNode routerNode = self.GetChild<RouterNode>(outerConn);
  492. if (routerNode == null)
  493. {
  494. Log.Warning($"kcp router inner msg not found outer nodes: {outerConn} {innerConn}");
  495. break;
  496. }
  497. // 比对innerConn
  498. if (routerNode.InnerConn != innerConn)
  499. {
  500. Log.Warning($"router node innerConn error: {innerConn} {outerConn} {routerNode.Status}");
  501. break;
  502. }
  503. // 重连,这个字段可能为空,需要客户端发送消息上来才能设置
  504. if (routerNode.OuterIpEndPoint == null)
  505. {
  506. break;
  507. }
  508. routerNode.LastRecvInnerTime = timeNow;
  509. routerNode.KcpTransport.Send(self.Cache, 0, messageLength, routerNode.OuterIpEndPoint);
  510. break;
  511. }
  512. }
  513. }
  514. private static RouterNode New(this RouterComponent self, string innerAddress, uint outerConn, uint innerConn, uint connectId, IPEndPoint syncEndPoint)
  515. {
  516. RouterNode routerNode = self.AddChildWithId<RouterNode>(outerConn);
  517. routerNode.InnerConn = innerConn;
  518. routerNode.ConnectId = connectId;
  519. routerNode.InnerIpEndPoint = NetworkHelper.ToIPEndPoint(innerAddress);
  520. routerNode.SyncIpEndPoint = syncEndPoint;
  521. routerNode.InnerAddress = innerAddress;
  522. routerNode.LastRecvInnerTime = TimeInfo.Instance.ClientNow();
  523. self.checkTimeout.Enqueue(outerConn);
  524. routerNode.Status = RouterStatus.Sync;
  525. Log.Info($"router new: outerConn: {outerConn} innerConn: {innerConn} {syncEndPoint}");
  526. return routerNode;
  527. }
  528. public static void OnError(this RouterComponent self, long id, int error)
  529. {
  530. RouterNode routerNode = self.GetChild<RouterNode>(id);
  531. if (routerNode == null)
  532. {
  533. return;
  534. }
  535. Log.Info($"router node remove: {routerNode.OuterConn} {routerNode.InnerConn} {error}");
  536. self.Remove(id);
  537. }
  538. private static void Remove(this RouterComponent self, long id)
  539. {
  540. RouterNode routerNode = self.GetChild<RouterNode>(id);
  541. if (routerNode == null)
  542. {
  543. return;
  544. }
  545. Log.Info($"router remove: {routerNode.Id} outerConn: {routerNode.OuterConn} innerConn: {routerNode.InnerConn}");
  546. routerNode.Dispose();
  547. }
  548. }
  549. }