RouterComponentSystem.cs 27 KB

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