/// <summary> /// Parse the kind of data we are receiving /// </summary> /// <returns></returns> private MessageType ReadMessageType(ClientTunnel client, byte[] data) { if (!client.Authenticated && client.AuthMethod == Method.Null) { return(MessageType.MethodRequest); } else if (!client.Authenticated && client.AuthMethod == Method.UserPassword) { return(MessageType.AuthRequest); } else if (data[0] == 0x05) { return(MessageType.DataRequest); } else { return(MessageType.Null); } }
private void AcceptCallback(IAsyncResult ar) { try { if (disposedValue) { return; } if (ar.AsyncState is TcpListener serverSocket) { TcpClient clientTcpClient = serverSocket.EndAcceptTcpClient(ar); var client = new ClientTunnel(clientTcpClient); ThreadPool.QueueUserWorkItem((WaitCallback) => { using (clientTcpClient) { using (client) { Clients.Add(client); NonBlockingConsole.WriteLine($"Client {clientTcpClient?.Client?.RemoteEndPoint} trying to connect, handling on thread {Thread.CurrentThread.ManagedThreadId}"); client?.Listen(); //Blocking async Clients.Remove(client); } } }); //Keep listening incoming connections. serverSocket.BeginAcceptTcpClient(AcceptCallback, Socks5Server); } if (disposedValue) { return; } } catch (Exception ex) { NonBlockingConsole.WriteLine(ex.Message); } }