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); }
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); } }); }