BindlLocal
							parent
							
								
									add66ce981
								
							
						
					
					
						commit
						065c76af4e
					
				|  | @ -29,10 +29,10 @@ namespace dotNetty_kcp | |||
| 
 | ||||
|         private IEventLoopGroup _eventLoopGroup; | ||||
| 
 | ||||
|         private IScheduleThread _scheduleThread;  | ||||
|         private IScheduleThread _scheduleThread; | ||||
| 
 | ||||
| 
 | ||||
|         private static IChannel bindLocal(Bootstrap bootstrap,EndPoint localAddress = null) | ||||
|         private static IChannel bindLocal(Bootstrap bootstrap, EndPoint localAddress = null) | ||||
|         { | ||||
|             if (localAddress == null) | ||||
|             { | ||||
|  | @ -44,22 +44,36 @@ namespace dotNetty_kcp | |||
| 
 | ||||
|         public System.Threading.Tasks.Task<IChannel> BindLocal() | ||||
|         { | ||||
|             var localAddress = new IPEndPoint(IPAddress.Any, 0); | ||||
|             //var localAddress = new IPEndPoint(IPAddress.Any, 0); | ||||
|             var localAddress = new IPEndPoint(GetLocalIPAddress(), 0); | ||||
|             return bootstrap.BindAsync(localAddress); | ||||
|         } | ||||
| 
 | ||||
|         public void init(ChannelConfig channelConfig,ExecutorPool executorPool,IEventLoopGroup eventLoopGroup) | ||||
|         public static string GetLocalIPAddress() | ||||
|         { | ||||
|             if(channelConfig.UseConvChannel) | ||||
|             var host = Dns.GetHostEntry(Dns.GetHostName()); | ||||
|             foreach (var ip in host.AddressList) | ||||
|             { | ||||
|                 if (ip.AddressFamily == AddressFamily.InterNetwork) | ||||
|                 { | ||||
|                     return ip.ToString(); | ||||
|                 } | ||||
|             } | ||||
|             throw new Exception("No network adapters with an IPv4 address in the system!"); | ||||
|         } | ||||
| 
 | ||||
|         public void init(ChannelConfig channelConfig, ExecutorPool executorPool, IEventLoopGroup eventLoopGroup) | ||||
|         { | ||||
|             if (channelConfig.UseConvChannel) | ||||
|             { | ||||
|                 var convIndex = 0; | ||||
|                 if(channelConfig.Crc32Check) | ||||
|                 if (channelConfig.Crc32Check) | ||||
|                 { | ||||
|                     convIndex+=Ukcp.HEADER_CRC; | ||||
|                     convIndex += Ukcp.HEADER_CRC; | ||||
|                 } | ||||
|                 if(channelConfig.FecDataShardCount!=0&&channelConfig.FecParityShardCount!=0) | ||||
|                 if (channelConfig.FecDataShardCount != 0 && channelConfig.FecParityShardCount != 0) | ||||
|                 { | ||||
|                     convIndex+= Fec.fecHeaderSizePlus2; | ||||
|                     convIndex += Fec.fecHeaderSizePlus2; | ||||
|                 } | ||||
|                 _channelManager = new ClientConvChannelManager(convIndex); | ||||
|             } | ||||
|  | @ -72,7 +86,7 @@ namespace dotNetty_kcp | |||
|             _executorPool = executorPool; | ||||
|             _executorPool.CreateMessageExecutor(); | ||||
|             _eventLoopGroup = eventLoopGroup; | ||||
|              | ||||
| 
 | ||||
|             _scheduleThread = new EventLoopScheduleThread(); | ||||
| 
 | ||||
|             bootstrap = new Bootstrap(); | ||||
|  | @ -81,7 +95,7 @@ namespace dotNetty_kcp | |||
|             bootstrap.Handler(new ActionChannelInitializer<SocketDatagramChannel>(channel => | ||||
|             { | ||||
|                 var pipeline = channel.Pipeline; | ||||
|                 pipeline.AddLast(new ClientChannelHandler(_channelManager,channelConfig)); | ||||
|                 pipeline.AddLast(new ClientChannelHandler(_channelManager, channelConfig)); | ||||
|             })); | ||||
|         } | ||||
| 
 | ||||
|  | @ -91,22 +105,23 @@ namespace dotNetty_kcp | |||
|         { | ||||
|             var executorPool = new ExecutorPool(); | ||||
|             executorPool.CreateMessageExecutor(); | ||||
|             init(channelConfig,executorPool,new MultithreadEventLoopGroup()); | ||||
|             init(channelConfig, executorPool, new MultithreadEventLoopGroup()); | ||||
|         } | ||||
|          | ||||
|          | ||||
| 
 | ||||
| 
 | ||||
|         /** | ||||
|          * 重连接口 | ||||
|          * 使用旧的kcp对象,出口ip和端口替换为新的 | ||||
|          * 在4G切换为wifi等场景使用 | ||||
|          * @param ukcp | ||||
|          */ | ||||
|         public void reconnect(Ukcp ukcp){ | ||||
|         public void reconnect(Ukcp ukcp) | ||||
|         { | ||||
|             if (!(_channelManager is ServerConvChannelManager)) | ||||
|             { | ||||
|                 throw new Exception("reconnect can only be used in convChannel"); | ||||
|             } | ||||
|             ukcp.IMessageExecutor.execute(new ReconnectTask(ukcp,bootstrap)); | ||||
|             ukcp.IMessageExecutor.execute(new ReconnectTask(ukcp, bootstrap)); | ||||
|         } | ||||
| 
 | ||||
|         private class ReconnectTask : ITask | ||||
|  | @ -129,7 +144,7 @@ namespace dotNetty_kcp | |||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         public Ukcp connect(IChannel localChannel,EndPoint remoteAddress, ChannelConfig channelConfig, KcpListener kcpListener) | ||||
|         public Ukcp connect(IChannel localChannel, EndPoint remoteAddress, ChannelConfig channelConfig, KcpListener kcpListener) | ||||
|         { | ||||
| 
 | ||||
|             KcpOutput kcpOutput = new KcpOutPutImp(); | ||||
|  | @ -146,22 +161,22 @@ namespace dotNetty_kcp | |||
|             var user = new User(localChannel, remoteAddress, localChannel.LocalAddress); | ||||
|             ukcp.user(user); | ||||
| 
 | ||||
|             _channelManager.New(localChannel.LocalAddress, ukcp,null); | ||||
|             _channelManager.New(localChannel.LocalAddress, ukcp, null); | ||||
| 
 | ||||
|             _messageExecutor.execute(new ConnectTask(ukcp, kcpListener)); | ||||
| 
 | ||||
|             var scheduleTask = new ScheduleTask( _channelManager, ukcp,_scheduleThread); | ||||
|              | ||||
|             _scheduleThread.schedule(scheduleTask,TimeSpan.FromMilliseconds(ukcp.getInterval())); | ||||
|             var scheduleTask = new ScheduleTask(_channelManager, ukcp, _scheduleThread); | ||||
| 
 | ||||
|             _scheduleThread.schedule(scheduleTask, TimeSpan.FromMilliseconds(ukcp.getInterval())); | ||||
|             return ukcp; | ||||
|         } | ||||
| 
 | ||||
|         /** | ||||
|          * 连接一个服务器 | ||||
|          */ | ||||
|         public Ukcp connect(EndPoint localAddress,EndPoint remoteAddress, ChannelConfig channelConfig, KcpListener kcpListener) | ||||
|         public Ukcp connect(EndPoint localAddress, EndPoint remoteAddress, ChannelConfig channelConfig, KcpListener kcpListener) | ||||
|         { | ||||
|             var channel = bindLocal(bootstrap,localAddress); | ||||
|             var channel = bindLocal(bootstrap, localAddress); | ||||
|             return connect(channel, remoteAddress, channelConfig, kcpListener); | ||||
|         } | ||||
| 
 | ||||
|  | @ -182,7 +197,7 @@ namespace dotNetty_kcp | |||
|                 ukcp.close(); | ||||
|             } | ||||
|             _executorPool?.stop(false); | ||||
|             if (_eventLoopGroup != null&&!_eventLoopGroup.IsShuttingDown) | ||||
|             if (_eventLoopGroup != null && !_eventLoopGroup.IsShuttingDown) | ||||
|             { | ||||
|                 _eventLoopGroup?.ShutdownGracefullyAsync().Wait(); | ||||
|             } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue