public override async Task StartAsync(CancellationToken cancellationToken) { _scope = _services.CreateScope(); var options = _scope.ServiceProvider.GetRequiredService <IOptionsSnapshot <NodeOptions> >().Value; _name = options.NodeName; var settings = new PNetMeshServerSettings { PublicKey = Convert.FromBase64String(options.PublicKey), PrivateKey = Convert.FromBase64String(options.PrivateKey), Psk = Convert.FromBase64String(options.Psk), BindTo = options.BindTo, Peers = options.Peers.Select(n => new PNetMeshPeer { PublicKey = Convert.FromBase64String(n.PublicKey), EndPoints = n.Endpoints, }).ToArray() }; _peers = new Dictionary <string, PNetMeshPeer>(options.Nodes.Length); foreach (var n in options.Nodes) { if (n.PublicKey != options.PublicKey) { _peers[n.Name] = new PNetMeshPeer { PublicKey = Convert.FromBase64String(n.PublicKey), EndPoints = Array.Empty <string>() } } ; } _logger.LogInformation($"Node[{_name}] starting..."); _server = ActivatorUtilities.CreateInstance <PNetMeshServer>(_scope.ServiceProvider, settings); _server.Start(); await base.StartAsync(cancellationToken); _logger.LogInformation($"Node[{_name}] started"); }
public async Task bind_three_server_to_localhost_and_relay_exchange() { using var key1 = KeyPair.Generate(); using var key2 = KeyPair.Generate(); using var key3 = KeyPair.Generate(); var psk = new byte[32]; RandomNumberGenerator.Fill(psk); var settings1 = new PNetMeshServerSettings { PublicKey = key1.PublicKey, PrivateKey = key1.PrivateKey, Psk = psk, BindTo = new[] { "127.0.0.1:5811" } }; var settings2 = new PNetMeshServerSettings { PublicKey = key2.PublicKey, PrivateKey = key2.PrivateKey, Psk = psk, BindTo = new[] { "127.0.0.1:5812" }, Peers = new[] { new PNetMeshPeer { PublicKey = settings1.PublicKey, EndPoints = settings1.BindTo } } }; var settings3 = new PNetMeshServerSettings { PublicKey = key3.PublicKey, PrivateKey = key3.PrivateKey, Psk = psk, BindTo = new[] { "127.0.0.1:5813" }, Peers = new[] { new PNetMeshPeer { PublicKey = settings1.PublicKey, EndPoints = settings1.BindTo } } }; using var server1 = new PNetMeshServer(settings1); using var server2 = new PNetMeshServer(settings2); using var server3 = new PNetMeshServer(settings3); server1.Start(); server2.Start(); server3.Start(); var peer1 = new PNetMeshPeer { PublicKey = settings1.PublicKey, EndPoints = Array.Empty <string>() }; var peer2 = new PNetMeshPeer { PublicKey = settings2.PublicKey, EndPoints = Array.Empty <string>(), //EndPoints = settings2.BindTo }; var peer3 = new PNetMeshPeer { PublicKey = settings3.PublicKey, EndPoints = Array.Empty <string>(), //EndPoints = settings3.BindTo }; var channel2_1 = await server2.ConnectToAsync(peer1); var channel3_1 = await server3.ConnectToAsync(peer1); //var r = channel2_1.TryWrite(Encoding.UTF8.GetBytes("Hello World! 1 from 2")); //Assert.True(r); //r = channel3_1.TryWrite(Encoding.UTF8.GetBytes("Hello World! 1 from 3")); //Assert.True(r); //discover over peer1 var channel3_2 = await server3.ConnectToAsync(peer2); //discover over pre connection var channel2_3 = await server2.ConnectToAsync(peer3); //await Task.Delay(500); string msg; bool r; ReadOnlyMemory <byte> payload; r = channel3_2.TryWrite(Encoding.UTF8.GetBytes("Hello World! 2 from 3")); Assert.True(r); r = channel2_3.TryWrite(Encoding.UTF8.GetBytes("Hello World! 3 from 2")); Assert.True(r); r = await channel3_2.WaitToReadAsync(); Assert.True(r); r = channel3_2.TryRead(out payload); Assert.True(r); Assert.True(payload.Length > 0); msg = Encoding.UTF8.GetString(payload.Span); Assert.Equal("Hello World! 3 from 2", msg); r = await channel2_3.WaitToReadAsync(); Assert.True(r); r = channel2_3.TryRead(out payload); Assert.True(r); Assert.True(payload.Length > 0); msg = Encoding.UTF8.GetString(payload.Span); Assert.Equal("Hello World! 2 from 3", msg); await Task.WhenAll( server1.ShutdownAsync(), server2.ShutdownAsync(), server3.ShutdownAsync() ); }
public async Task bind_two_server_to_localhost_and_exchange() { using var key1 = KeyPair.Generate(); using var key2 = KeyPair.Generate(); var psk = new byte[32]; RandomNumberGenerator.Fill(psk); var settings1 = new PNetMeshServerSettings { PublicKey = key1.PublicKey, PrivateKey = key1.PrivateKey, Psk = psk, BindTo = new[] { "127.0.0.1:5801" } }; var settings2 = new PNetMeshServerSettings { PublicKey = key2.PublicKey, PrivateKey = key2.PrivateKey, Psk = psk, BindTo = new[] { "127.0.0.1:5802" }, Peers = new[] { new PNetMeshPeer { PublicKey = settings1.PublicKey, EndPoints = settings1.BindTo } } }; using var server1 = new PNetMeshServer(settings1); using var server2 = new PNetMeshServer(settings2); server1.Start(); server2.Start(); var peer1 = new PNetMeshPeer { PublicKey = settings1.PublicKey, //EndPoints = settings1.BindTo EndPoints = Array.Empty <string>() }; var peer2 = new PNetMeshPeer { PublicKey = settings2.PublicKey, EndPoints = Array.Empty <string>() //no endpoint }; var channel2_1 = await server2.ConnectToAsync(peer1); var r = channel2_1.TryWrite(Encoding.UTF8.GetBytes("Hello World! 1 from 2")); Assert.True(r); var channel1_2 = await server1.ConnectToAsync(peer2); r = channel1_2.TryWrite(Encoding.UTF8.GetBytes("Hello World! 2 from 1")); Assert.True(r); r = await channel1_2.WaitToReadAsync(); Assert.True(r); r = channel1_2.TryRead(out var payload); Assert.True(r); Assert.True(payload.Length > 0); var msg = Encoding.UTF8.GetString(payload.Span); Assert.Equal("Hello World! 1 from 2", msg); r = await channel2_1.WaitToReadAsync(); Assert.True(r); r = channel2_1.TryRead(out payload); Assert.True(r); Assert.True(payload.Length > 0); msg = Encoding.UTF8.GetString(payload.Span); Assert.Equal("Hello World! 2 from 1", msg); for (int i = 0; i < 100; i++) { r = channel1_2.TryWrite(Encoding.UTF8.GetBytes($"Msg[{i}]")); Assert.True(r); } for (int i = 0; i < 100; i++) { r = channel2_1.TryRead(out payload); if (!r) { await channel2_1.WaitToReadAsync(); r = channel2_1.TryRead(out payload); } Assert.True(r); msg = Encoding.UTF8.GetString(payload.Span); Assert.Equal($"Msg[{i}]", msg); } await Task.WhenAll(server1.ShutdownAsync(), server2.ShutdownAsync()); }