public static async Task <MyTcpProxyServer> CreateInstance(
            MyTcpProxyServerSettings settings
            )
        {
            if (settings == null)
            {
                throw new ArgumentNullException(
                          MyNameof.GetLocalVarName(() => settings));
            }
            settings.CheckMe();
            var result = new MyTcpProxyServer();

            result._clientToDestination = new TcpClient();
            await result._clientToDestination.ConnectAsync(
                settings.DestinationHostname,
                settings.DestinationPort
                ).ConfigureAwait(false);

            try
            {
                result._serverTcpListener = new TcpListener(
                    IPAddress.Parse(settings.ServerHostname),
                    settings.ServerPort
                    );
                result._serverTcpListener.Start();
                try
                {
                    result._stateHelper.SetInitializedState();
                    result.WaitClientConnectAction();
                    return(result);
                }
                catch
                {
                    result._serverTcpListener.Stop();
                    throw;
                }
            }
            catch
            {
                result._clientToDestination.Close();
                throw;
            }
        }
Beispiel #2
0
        public async Task TestReconnectingReliable()
        {
            const string addressSend = "127.0.0.1";
            const int    portSend    = 7656;
            /**/
            var proxyHostname = "127.0.0.1";
            var proxyPort     = 17000;
            var proxyServer   = await MyTcpProxyServer.CreateInstance(
                new MyTcpProxyServerSettings()
            {
                DestinationHostname = addressSend,
                DestinationPort     = portSend,
                ServerHostname      = proxyHostname,
                ServerPort          = proxyPort
            }
                ).ConfigureAwait(false);

            /**/
            const string addressRecv = addressSend;
            const int    portRecv    = portSend;
            string       sendPrivKeys;
            /**/
            {
                var samHelperSend = await SamHelper.CreateInstance(
                    new SamHelperSettings()
                {
                    SamServerAddress = addressSend,
                    SamServerPort    = portSend
                }, CancellationToken.None
                    ).ConfigureAwait(false);

                sendPrivKeys = samHelperSend.Session.PrivateKey;
                await samHelperSend.MyDisposeAsync().ConfigureAwait(false);
            }
            /**/
            var reconnectingSamHelperSend = await ReconnectingSamHelper.CreateInstance(
                new ReconnectingSamHelperSettings()
            {
                ImplementationHelperSettings =
                    new SamHelperSettings()
                {
                    SamServerAddress   = proxyHostname,
                    SamServerPort      = proxyPort,
                    SessionPrivateKeys = sendPrivKeys
                }
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var samHelperReceive = await SamHelper.CreateInstance(
                new SamHelperSettings()
            {
                SamServerAddress = addressRecv,
                SamServerPort    = portRecv
            }, CancellationToken.None
                ).ConfigureAwait(false);

            var reliableHelperSend = new ReliableSamHelper(
                reconnectingSamHelperSend,
                new ReliableSamHelperSettings()
                );
            var reliableHelperRecv = new ReliableSamHelper(
                samHelperReceive,
                new ReliableSamHelperSettings()
                );
            var data = new byte[200000];

            MiscFuncs.GetRandomBytes(data);
            /**/
            await testSendReceiveFunc(
                reliableHelperRecv,
                reconnectingSamHelperSend,
                reliableHelperSend,
                data,
                samHelperReceive
                ).ConfigureAwait(false);

            await proxyServer.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("###################################");
            await Assert.ThrowsAsync <TimeoutException>(
                async() => await testSendReceiveFunc(
                    reliableHelperRecv,
                    reconnectingSamHelperSend,
                    reliableHelperSend,
                    data,
                    samHelperReceive
                    ).ConfigureAwait(false)
                ).ConfigureAwait(false);

            /**/
            _logger.Trace("###################################");
            proxyServer = await MyTcpProxyServer.CreateInstance(
                new MyTcpProxyServerSettings()
            {
                DestinationHostname = addressSend,
                DestinationPort     = portSend,
                ServerHostname      = proxyHostname,
                ServerPort          = proxyPort
            }
                ).ConfigureAwait(false);

            reconnectingSamHelperSend.TryToReconnect(DateTime.UtcNow);
            await Task.Delay(TimeSpan.FromSeconds(15.0d)).ConfigureAwait(false);

            /**/
            await testSendReceiveFunc(
                reliableHelperRecv,
                reconnectingSamHelperSend,
                reliableHelperSend,
                data,
                samHelperReceive
                ).ConfigureAwait(false);

            /**/
            await reliableHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperSend disposed");
            await reliableHelperRecv.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("reliableHelperRecv disposed");
            await reconnectingSamHelperSend.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperSend disposed");
            await samHelperReceive.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("samHelperReceive disposed");
            await proxyServer.MyDisposeAsync().ConfigureAwait(false);

            _logger.Trace("{0} disposed", MyNameof.GetLocalVarName(() => proxyServer));
        }
 public static async Task<MyTcpProxyServer> CreateInstance(
     MyTcpProxyServerSettings settings
 )
 {
     if(settings == null)
         throw new ArgumentNullException(
             MyNameof.GetLocalVarName(() => settings));
     settings.CheckMe();
     var result = new MyTcpProxyServer();
     result._clientToDestination = new TcpClient();
     await result._clientToDestination.ConnectAsync(
         settings.DestinationHostname,
         settings.DestinationPort
     ).ConfigureAwait(false);
     try
     {
         result._serverTcpListener = new TcpListener(
             IPAddress.Parse(settings.ServerHostname),
             settings.ServerPort
         );
         result._serverTcpListener.Start();
         try
         {
             result._stateHelper.SetInitializedState();
             result.WaitClientConnectAction();
             return result;
         }
         catch
         {
             result._serverTcpListener.Stop();
             throw;
         }
     }
     catch
     {
         result._clientToDestination.Close();
         throw;
     }
 }