diff --git a/Runtime/csharp-kcp/dotNetty-kcp/KcpClient.cs b/Runtime/csharp-kcp/dotNetty-kcp/KcpClient.cs index dea436e..adb5f07 100644 --- a/Runtime/csharp-kcp/dotNetty-kcp/KcpClient.cs +++ b/Runtime/csharp-kcp/dotNetty-kcp/KcpClient.cs @@ -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 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(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(); }