private ITransport CreateTransport(I2PRouterInfo ri) { ITransport transport = null; try { var ntcpaddr = ri.Adresses.Where(a => (a.TransportStyle == "NTCP") && a.HaveHostAndPort && (RouterContext.Inst.UseIpV6 || a.Options.ValueContains("host", "."))); var ssuaddr = ri.Adresses.Where(a => (a.TransportStyle == "SSU") && a.Options.Contains("key") && (RouterContext.Inst.UseIpV6 || a.Options.ValueContains("host", ".") || a.Options.ValueContains("ihost0", "."))); I2PRouterAddress ra = ssuaddr .Where(a => a.Options.Contains("host")) .Random() ?? ntcpaddr.Random() ?? ssuaddr.Random(); if (ra == null) { Logging.LogTransport( $"TransportProvider: CreateTransport: No usable address found for {ri.Identity.IdentHash.Id32Short}!"); return(null); } switch (ra.TransportStyle.ToString()) { case "SSU": transport = SsuHost.AddSession(ra, ri.Identity); break; case "NTCP": transport = new NTCPClientOutgoing(ra, ri.Identity); break; default: throw new NotImplementedException(); } Logging.LogTransport( string.Format("TransportProvider: Creating new {0} transport {2} to {1}", ra.TransportStyle, ri.Identity.IdentHash.Id32Short, transport.DebugId)); AddTransport(transport); transport.Connect(); var dstore = new DatabaseStoreMessage(RouterContext.Inst.MyRouterInfo); transport.Send(dstore); } catch (Exception ex) { #if LOG_MUCH_TRANSPORT Logging.LogTransport(ex); Logging.LogTransport("TransportProvider: CreateTransport stack trace: " + System.Environment.StackTrace); #else Logging.LogTransport($"TransportProvider: Exception [{ex.GetType()}] " + $"'{ex.Message}' to {ri.Identity.IdentHash.Id32Short}."); #endif if (transport != null) { Remove(transport); } throw; } return(transport); }
private ITransport CreateTransport(I2PRouterInfo ri) { ITransport transport = null; try { I2PRouterAddress ra_ntcp = null; var ntcpaddr = ri.Adresses.Where(a => (a.TransportStyle == "NTCP") && a.Options.Contains("host") && a.Options.Contains("port") && (RouterContext.Inst.UseIpV6 || a.Options["host"].Contains('.'))); var a1 = ntcpaddr.Where(a => GetAddressFamiliy(a, "host") == System.Net.Sockets.AddressFamily.InterNetwork); if (a1.Any()) { ra_ntcp = a1.Random(); } else { a1 = ntcpaddr.Where(a => Dns.GetHostEntry(a.Options["host"]).AddressList. Any(aa => aa.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)); if (a1.Any()) { ra_ntcp = a1.Random(); } } I2PRouterAddress ra_ssu = null; var ssuaddr = ri.Adresses.Where(a => (a.TransportStyle == "SSU") && a.Options.Contains("key")); a1 = ssuaddr.Where(a => GetAddressFamiliy(a, "host") == System.Net.Sockets.AddressFamily.InterNetwork || GetAddressFamiliy(a, "ihost0") == System.Net.Sockets.AddressFamily.InterNetwork); if (a1.Any()) { ra_ssu = a1.Random(); } else { a1 = ntcpaddr.Where(a => Dns.GetHostEntry(a.Options["host"]).AddressList. Any(aa => aa.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)); if (a1.Any()) { ra_ssu = a1.Random(); } else { a1 = ntcpaddr.Where(a => Dns.GetHostEntry(a.Options["ihost0"]).AddressList. Any(aa => aa.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)); if (a1.Any()) { ra_ssu = a1.Random(); } } } I2PRouterAddress ra; //if ( ra_ntcp != null ) ra = ra_ntcp; else ra = ra_ssu; if (ra_ssu != null) { ra = ra_ssu; } else { ra = ra_ntcp; } if (ra == null) { Logging.LogTransport( string.Format("TransportProvider: CreateTransport: No usable address found for {0}!", ri.Identity.IdentHash.Id32Short)); return(null); } switch (ra.TransportStyle.ToString()) { case "SSU": transport = SsuHost.AddSession(ra, ri.Identity); break; case "NTCP": transport = new NTCPClientOutgoing(ra, ri.Identity); break; default: throw new NotImplementedException(); } Logging.LogTransport( string.Format("TransportProvider: Creating new {0} transport {2} to {1}", ra.TransportStyle, ri.Identity.IdentHash.Id32Short, transport.DebugId)); AddTransport(transport, ri.Identity.IdentHash); transport.Connect(); var dstore = new DatabaseStoreMessage(RouterContext.Inst.MyRouterInfo); transport.Send(dstore); } catch (Exception ex) { #if LOG_ALL_TRANSPORT Logging.LogTransport(ex); Logging.LogTransport("TransportProvider: CreateTransport stack trace: " + System.Environment.StackTrace); #else Logging.LogTransport("TransportProvider: Exception [" + ex.GetType().ToString() + "] '" + ex.Message + "' to " + ri.Identity.IdentHash.Id32Short + "."); #endif if (transport != null) { Remove(transport); } throw; } return(transport); }