コード例 #1
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);
        }
コード例 #2
0
        public async Task StartAsync()
        {
            var endpoint = new IPEndPoint(IPAddress.Any, backendPort);

            socket.Bind(endpoint);
            socket.Listen(200);

            await Task.Factory.StartNew(async() =>
            {
                logger.LogInformation($"listen on : {endpoint.Port}");

                while (true)
                {
                    var clientSocket      = await socket.AcceptAsync();
                    var connectionId      = idGenerator.Next();
                    var channel           = new MarkedProxyChannel(connectionId, clientSocket, logger, new ChannelOptions());
                    channel.DataReceived += OnDataReceived;
                    channel.Closed       += OnMarkedProxyChannelClosedAsync;
                    _ = channel.StartAsync();
                    clientChannelHolder.TryAdd(connectionId, channel);
                }
            });
        }