RouterComponentSystem.cs 27 KB

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