Example #1
0
        static async Task Main(string[] args)
        {
            var encoder = new ProxyPackageEncoder();
            var decoder = new ProxyPackageDecoder();
            var socket  = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            var endpoint = new IPEndPoint(IPAddress.Any, 9091);

            socket.Bind(endpoint);

            socket.Listen(10);
            Console.WriteLine($"开始监听:{endpoint}");
            var factory = new LoggerFactory();
            var logger  = factory.CreateLogger("");

            while (true)
            {
                var nscoket = await socket.AcceptAsync();

                Console.WriteLine($"连接成功:{nscoket.RemoteEndPoint}");
                var channel = new ProxyChannel <ProxyPackage>(nscoket, encoder, decoder, logger, new ChannelOptions());
                channel.PackageReceived += async(channl, package) =>
                {
                    Console.WriteLine($"接收到一个数据包:{package},内容:{Encoding.UTF8.GetString(package.Data)}");
                    var reply = new ProxyPackage
                    {
                        Data = Encoding.UTF8.GetBytes("你好呀")
                    };
                    await channel.SendAsync(package);
                };
                await channel.StartAsync();
            }
        }
Example #2
0
        private async Task ProcessTransfer(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            IChannel targetChannel;

            if (!serverChannelHolder.ContainsKey(package.ConnectionId))
            {
                var targetEp = new IPEndPoint(IPAddress.Parse(channelConfig.FrontendIp), channelConfig.FrontendPort);
                var wrapper  = new TimeoutSocketWrapper(targetEp);
                var nsocket  = wrapper.Connect(channelOptions.ConnectTimeout);
                if (nsocket == null)
                {
                    await SendDisconnectPackage(channel, package.ConnectionId);

                    return;
                }
                var connectionId = package.ConnectionId;
                targetChannel = new MarkedProxyChannel(connectionId, nsocket, logger, channelOptions);
                targetChannel.DataReceived += OnDataReceived;
                serverChannelHolder[package.ConnectionId] = targetChannel;
                _ = targetChannel.StartAsync();
            }
            else
            {
                targetChannel = serverChannelHolder[package.ConnectionId];
            }

            await targetChannel.SendAsync(package.Data);
        }
Example #3
0
        private async Task ProcessAuthentication(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            var model = package.Data.BytesToObject <AuthenticationModel>();

            var pass = await configHelper.CheckClientAsync(model.ClientId, model.SecretKey);

            if (!pass)
            {
                await channel.SendAsync(new ProxyPackage
                {
                    Data = new AuthenticationResult
                    {
                        Success = false,
                        Message = "ClientId not exits or SecretKey not correct"
                    }.ObjectToBytes(),
                    Type = PackageType.Authentication
                });
            }
            else
            {
                var channels = await configHelper.GetChannelsAsync(model.ClientId);

                await channel.SendAsync(new ProxyPackage
                {
                    Data = new AuthenticationResult
                    {
                        Success  = true,
                        Channels = channels
                    }.ObjectToBytes(),
                    Type = PackageType.Authentication
                });
            }
        }
        private async Task ProcessDisconnect(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            var existsChannel = clientChannelHolder[package.ConnectionId];
            await existsChannel?.Close();

            await Task.CompletedTask;
        }
Example #5
0
 private async Task ProcessDisconect(IChannel <ProxyPackage> channel, ProxyPackage package)
 {
     if (serverChannelHolder.ContainsKey(package.ConnectionId))
     {
         //logger.LogInformation("收到服务端发送的断开连接");
         await serverChannelHolder[package.ConnectionId].Close();
         serverChannelHolder.Remove(package.ConnectionId);
     }
     await Task.CompletedTask;
 }
Example #6
0
 private async Task TransferAsync(long connectionId, byte[] data)
 {
     var package = new ProxyPackage
     {
         ChannelId    = channelConfig.ChannelId,
         ConnectionId = connectionId,
         Data         = data,
         Type         = PackageType.Transfer
     };
     await proxyChannel.SendAsync(package);
 }
Example #7
0
        private async Task OnPackageReceived(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            switch (package.Type)
            {
            case PackageType.Transfer:
                await ProcessTransfer(channel, package);

                break;

            case PackageType.Disconnect:
                await ProcessDisconect(channel, package);

                break;
            }
        }
Example #8
0
        private async Task OnPackageReceived(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            switch (package.Type)
            {
            case PackageType.Connect:
                await ProcessConnect(channel, package);

                break;

            case PackageType.Authentication:
                await ProcessAuthentication(channel, package);

                break;
            }
        }
Example #9
0
        private async Task ProcessConnect(IChannel <ProxyPackage> channel, ProxyPackage package)
        {
            var channelConfig = await configHelper.GetChannelAsync(package.ChannelId);

            var connection = new ProxyServerConnection(package.ChannelId, channel, channelConfig.BackendPort, logger, idGenerator);

            if (proxyServerConnectionHolder.ContainsKey(package.ChannelId))
            {
                await proxyServerConnectionHolder[package.ChannelId].StopAsync();
                proxyServerConnectionHolder.Remove(package.ChannelId);
            }

            proxyServerConnectionHolder[package.ChannelId] = connection;
            await connection.StartAsync();
        }
Example #10
0
        static async Task Main(string[] args)
        {
            var encoder = new ProxyPackageEncoder();
            var decoder = new ProxyPackageDecoder();
            var socket  = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            var endpoint = new IPEndPoint(IPAddress.Loopback, 9091);

            await socket.ConnectAsync(endpoint);

            var factory = new LoggerFactory();
            var logger  = factory.CreateLogger("");
            var options = new ChannelOptions();
            var channel = new ProxyChannel <ProxyPackage>(socket, encoder, decoder, logger, options);

            channel.PackageReceived += async(channl, package) =>
            {
                Console.WriteLine($"接收到一个数据包:{package},内容:{Encoding.UTF8.GetString(package.Data)}");
                await Task.CompletedTask;
            };

            _ = channel.StartAsync();
            var c = 0;

            while (c < 100000)
            {
                var package = new ProxyPackage
                {
                    ChannelId    = 1,
                    ConnectionId = 100,
                    Type         = PackageType.Transfer,
                    Data         = Encoding.UTF8.GetBytes(c.ToString())
                };

                await channel.SendAsync(package);

                c++;
            }

            Console.ReadKey();
        }
Example #11
0
        private async Task OnAuthPackageReceived(IChannel <ProxyPackage> authChannel, ProxyPackage package)
        {
            var result = package.Data.BytesToObject <AuthenticationResult>();

            if (!result.Success)
            {
                logger.LogInformation($"Authentication fail,message:{result.Message}");
                return;
            }
            var channels = result.Channels;

            if (channels.Count == 0)
            {
                logger.LogInformation("Not channel in config");
                return;
            }
            foreach (var channel in channels)
            {
                var connection = new ProxyClientConnection(logger, IPAddress.Parse(options.ServerAddress), options.ServerPort, channel, encoder, decoder);
                var task       = connection.StartAsync();
                channelTaskList.Add(task);
                clientConnectionHolder.Add(channel.ChannelId, connection);
                logger.LogInformation($"Start channel:{channel.ChannelId},targetIp:{channel.FrontendIp},targetPort:{channel.FrontendPort},serverPort:{channel.BackendPort}");
            }

            await authChannel.Close();

            await Task.CompletedTask;
        }
 private async Task ProcessTransfer(IChannel <ProxyPackage> channel, ProxyPackage package)
 {
     var existsChannel = clientChannelHolder[package.ConnectionId];
     await existsChannel.SendAsync(package.Data);
 }