// This test does not work //[Test] public void TestSSU() { //Logging.LogToFile( "TestSSU.log" ); RouterContext testcontext = new RouterContext(new I2PCertificate(I2PSigningKey.SigningKeyTypes.DSA_SHA1)); testcontext.DefaultTCPPort = 2048 + BufUtils.RandomInt(5000); testcontext.DefaultUDPPort = 2048 + BufUtils.RandomInt(5000); var host = new SSUHost(testcontext, new FixedMTU()); host.AllowConnectToSelf = true; host.ConnectionCreated += host_ConnectionCreated; // Remote var dnsa = Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(a => a.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault(); var addr = new I2PRouterAddress(dnsa, testcontext.UDPPort, 6, "SSU"); addr.Options["key"] = FreenetBase64.Encode(testcontext.IntroKey); RouterContext remotetestcontext = new RouterContext(new I2PCertificate(I2PSigningKey.SigningKeyTypes.DSA_SHA1)); remotetestcontext.DefaultTCPPort = testcontext.DefaultTCPPort + 5; remotetestcontext.DefaultUDPPort = testcontext.DefaultUDPPort + 5; var remotehost = new SSUHost(remotetestcontext, new FixedMTU()); remotehost.AllowConnectToSelf = true; var client = remotehost.AddSession(addr, testcontext.MyRouterIdentity); client.Connect(); var data = new BufLen(BufUtils.RandomBytes(30000)); var messagecount = 900; // If the out queue is larger than 1000 msgs we start discarding them for (int i = 0; i < messagecount; ++i) { client.Send(new DataMessage(data)); } System.Threading.Thread.Sleep(10000); for (int i = 0; i < messagecount; ++i) { if (i % 10 == 0) { System.Threading.Thread.Sleep(100); } client.Send(new DataMessage(data)); } var start = new TickCounter(); while (DataReceived.Count < 2 * messagecount) { if (start.DeltaToNow.ToMinutes >= 1) { Assert.Fail("Failed to receive sent data due to a timeout"); break; } System.Threading.Thread.Sleep(500); } for (int i = 0; i < 100; ++i) { Assert.IsTrue(((DataMessage)DataReceived.Random().Message).DataMessagePayload == new BufLen(data)); } System.Threading.Thread.Sleep(500); client.Terminate(); System.Threading.Thread.Sleep(500); host.Terminate(); System.Threading.Thread.Sleep(500); }
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); }