From 59e855e31e5baae3e5f08b88c0406bbad903fdb3 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 26 Mar 2021 15:49:53 +0300 Subject: [PATCH] Added unit test for proxy --- ZeroLevel.UnitTests/NetworkTest.cs | 37 ++++++++++++ ZeroLevel/Services/Network/Proxies/Proxy.cs | 62 ++++++++++++++++----- ZeroLevel/ZeroLevel.csproj | 10 ++-- 3 files changed, 89 insertions(+), 20 deletions(-) diff --git a/ZeroLevel.UnitTests/NetworkTest.cs b/ZeroLevel.UnitTests/NetworkTest.cs index dcd0136..fb3d6ec 100644 --- a/ZeroLevel.UnitTests/NetworkTest.cs +++ b/ZeroLevel.UnitTests/NetworkTest.cs @@ -2,6 +2,7 @@ using System.Threading; using Xunit; using ZeroLevel.Services.Applications; +using ZeroLevel.Services.Network.Proxies; namespace ZeroLevel.Network { @@ -63,6 +64,42 @@ namespace ZeroLevel.Network } } + [Fact] + public void ProxyTest() + { + bool got_message_no_request = false; + bool got_message_with_request = false; + + using (var proxy = new Proxy(NetUtils.CreateIPEndPoint("127.0.0.1:92"))) + { + proxy.AppendServer(NetUtils.CreateIPEndPoint("127.0.0.1:93")); + proxy.Run(); + var server = Exchange.UseHost(NetUtils.CreateIPEndPoint("127.0.0.1:93")); + server.RegisterInbox("empty", (_) => + { + got_message_no_request = true; + }); + server.RegisterInbox((_, ___) => + { + got_message_with_request = true; + }); + + var client = Exchange.GetConnection(NetUtils.CreateIPEndPoint("127.0.0.1:92")); + int repeat = 10; + + Assert.True(client.Send("empty")); + Assert.True(client.Send(true)); + while (!got_message_no_request || !got_message_with_request) + { + Thread.Sleep(200); + repeat--; + if (repeat == 0) break; + } + } + Assert.True(got_message_no_request, "No signal for no request default inbox"); + Assert.True(got_message_with_request, "No signal for default inbox"); + } + protected override void StartAction() { throw new NotImplementedException(); diff --git a/ZeroLevel/Services/Network/Proxies/Proxy.cs b/ZeroLevel/Services/Network/Proxies/Proxy.cs index 68844a0..cfa143e 100644 --- a/ZeroLevel/Services/Network/Proxies/Proxy.cs +++ b/ZeroLevel/Services/Network/Proxies/Proxy.cs @@ -1,10 +1,12 @@ -using System.Net; +using System; +using System.Net; using System.Net.Sockets; using System.Threading.Tasks; namespace ZeroLevel.Services.Network.Proxies { public class Proxy + : IDisposable { private readonly ProxyBalancer _balancer = new ProxyBalancer(); @@ -16,30 +18,60 @@ namespace ZeroLevel.Services.Network.Proxies { _incomingSocket = new Socket(listenEndpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); _incomingSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, true); - _incomingSocket.Bind(listenEndpoint); - _incomingSocket.Listen(100); + _incomingSocket.Bind(listenEndpoint); } - public async Task Run() + public void Run() { - while (true) + Task.Factory.StartNew(async () => { - var socket = await _incomingSocket.AcceptAsync(); - // no await! - CreateProxyConnection(socket); + try + { + _incomingSocket.Listen(100); + while (true) + { + var socket = await _incomingSocket.AcceptAsync(); + // no await! + Task.Run(async () => + { + await CreateProxyConnection(socket); + }); + } + } + catch (Exception ex) + { + Log.Error(ex, "[Proxy.Run]"); + } + }); + } + + private async Task CreateProxyConnection(Socket connection) + { + try + { + var endpoint = _balancer.GetServerProxy(); + var server = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, true); + server.Connect(endpoint); + using (var bind = new ProxyBinding(connection, server)) + { + await bind.Bind(); + } + } + catch (Exception ex) + { } } - public async Task CreateProxyConnection(Socket connection) + public void Dispose() { - var endpoint = _balancer.GetServerProxy(); - var server = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, true); - server.Bind(endpoint); - using (var bind = new ProxyBinding(connection, server)) + try { - await bind.Bind(); + _incomingSocket.Shutdown(SocketShutdown.Both); + _incomingSocket.Dispose(); } + catch (Exception ex) + { } } } } diff --git a/ZeroLevel/ZeroLevel.csproj b/ZeroLevel/ZeroLevel.csproj index 00f4459..cf2666b 100644 --- a/ZeroLevel/ZeroLevel.csproj +++ b/ZeroLevel/ZeroLevel.csproj @@ -6,16 +6,16 @@ ogoun ogoun - 3.3.5.1 - Light Fix in MemoryStreamWriter, MemoryStreamReader + 3.3.5.2 + Added tcp proxy https://github.com/ogoun/Zero/wiki - Copyright Ogoun 2020 + Copyright Ogoun 2021 https://github.com/ogoun/Zero GitHub - 3.3.5.1 - 3.3.5.1 + 3.3.5.2 + 3.3.5.2 AnyCPU;x64;x86 zero.png