public static bool Handle(ByteBuffer request, Tunnel tunnel) { bool result = false; if (request != null && tunnel != null) { int version = request[0]; // check if is socks version 5 if (version == '\u0005') { string reply = "\u0005\u0000"; result = tunnel.WriteL(reply); if (result) { ByteBuffer buffer = new ByteBuffer(); int read = tunnel.ReadL(buffer); if (read >= 2) { SOCKS5_CMDType cmdType = (SOCKS5_CMDType)buffer[1]; switch (cmdType) { case SOCKS5_CMDType.Connect: result = HandleTCPReq(buffer, tunnel); break; } } } } } return(result); }
public static Tunnel Handle(byte[] request, Socket socket2Client) { Tunnel result = null; if (request != null && socket2Client != null) { int version = request[0]; // check if is socks version 5 if (version == '\u0005') { string reply = "\u0005\u0000"; byte[] buffer = Encoding.ASCII.GetBytes(reply); int written; try { written = socket2Client.Send(buffer); } catch { written = 0; } if (written > 0) { buffer = new byte[100]; int read; try { read = socket2Client.Receive(buffer); } catch { read = 0; } if (read > 0) { SOCKS5_CMDType cmdType = (SOCKS5_CMDType)buffer[1]; switch (cmdType) { case SOCKS5_CMDType.Connect: result = HandleTCPReq(buffer, socket2Client); break; } } } } } return(result); }