diff --git a/VAR.Toolbox/UI/FrmToolbox.Designer.cs b/VAR.Toolbox/UI/FrmToolbox.Designer.cs
index 238d7df..ead5fda 100644
--- a/VAR.Toolbox/UI/FrmToolbox.Designer.cs
+++ b/VAR.Toolbox/UI/FrmToolbox.Designer.cs
@@ -32,6 +32,7 @@
this.btnBase64 = new System.Windows.Forms.Button();
this.btnProxyCmd = new System.Windows.Forms.Button();
this.btnWebcam = new System.Windows.Forms.Button();
+ this.btnTunnelTCP = new System.Windows.Forms.Button();
this.pnlSuspension1 = new VAR.Toolbox.UI.PnlSuspension();
this.pnlCover1 = new VAR.Toolbox.UI.PnlCover();
this.SuspendLayout();
@@ -75,11 +76,23 @@
this.btnWebcam.UseVisualStyleBackColor = true;
this.btnWebcam.Click += new System.EventHandler(this.btnWebcam_Click);
//
+ // btnTunnelTCP
+ //
+ this.btnTunnelTCP.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnTunnelTCP.Location = new System.Drawing.Point(18, 208);
+ this.btnTunnelTCP.Name = "btnTunnelTCP";
+ this.btnTunnelTCP.Size = new System.Drawing.Size(278, 55);
+ this.btnTunnelTCP.TabIndex = 5;
+ this.btnTunnelTCP.Text = "TunnelTCP";
+ this.btnTunnelTCP.UseVisualStyleBackColor = true;
+ this.btnTunnelTCP.Click += new System.EventHandler(this.btnTunnelTCP_Click);
+ //
// pnlSuspension1
//
this.pnlSuspension1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
- this.pnlSuspension1.Location = new System.Drawing.Point(18, 373);
+ this.pnlSuspension1.Location = new System.Drawing.Point(18, 432);
this.pnlSuspension1.Name = "pnlSuspension1";
this.pnlSuspension1.Size = new System.Drawing.Size(278, 175);
this.pnlSuspension1.TabIndex = 4;
@@ -88,7 +101,7 @@
//
this.pnlCover1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
- this.pnlCover1.Location = new System.Drawing.Point(18, 219);
+ this.pnlCover1.Location = new System.Drawing.Point(18, 278);
this.pnlCover1.Name = "pnlCover1";
this.pnlCover1.Size = new System.Drawing.Size(278, 148);
this.pnlCover1.TabIndex = 3;
@@ -97,7 +110,8 @@
//
this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.ClientSize = new System.Drawing.Size(309, 560);
+ this.ClientSize = new System.Drawing.Size(309, 619);
+ this.Controls.Add(this.btnTunnelTCP);
this.Controls.Add(this.pnlSuspension1);
this.Controls.Add(this.pnlCover1);
this.Controls.Add(this.btnWebcam);
@@ -122,6 +136,7 @@
private System.Windows.Forms.Button btnWebcam;
private PnlCover pnlCover1;
private PnlSuspension pnlSuspension1;
+ private System.Windows.Forms.Button btnTunnelTCP;
}
}
diff --git a/VAR.Toolbox/UI/FrmToolbox.cs b/VAR.Toolbox/UI/FrmToolbox.cs
index bcdcf38..2022d5c 100644
--- a/VAR.Toolbox/UI/FrmToolbox.cs
+++ b/VAR.Toolbox/UI/FrmToolbox.cs
@@ -32,6 +32,11 @@ namespace VAR.Toolbox.UI
CreateWindow(typeof(FrmWebcam));
}
+ private void btnTunnelTCP_Click(object sender, EventArgs e)
+ {
+ CreateWindow(typeof(FrmTunnelTCP));
+ }
+
#region Window handling
private Form CreateWindow(Type type)
@@ -85,6 +90,5 @@ namespace VAR.Toolbox.UI
}
#endregion Window handling
-
}
}
diff --git a/VAR.Toolbox/UI/FrmTunnelTCP.Designer.cs b/VAR.Toolbox/UI/FrmTunnelTCP.Designer.cs
new file mode 100644
index 0000000..b167e00
--- /dev/null
+++ b/VAR.Toolbox/UI/FrmTunnelTCP.Designer.cs
@@ -0,0 +1,161 @@
+namespace VAR.Toolbox.UI
+{
+ partial class FrmTunnelTCP
+ {
+ ///
+ /// Required designer variable.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// Clean up any resources being used.
+ ///
+ /// true if managed resources should be disposed; otherwise, false.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Windows Form Designer generated code
+
+ ///
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ ///
+ private void InitializeComponent()
+ {
+ this.btnRun = new System.Windows.Forms.Button();
+ this.btnStop = new System.Windows.Forms.Button();
+ this.lblRemoteHost = new System.Windows.Forms.Label();
+ this.lblRemotePort = new System.Windows.Forms.Label();
+ this.lblLocalPort = new System.Windows.Forms.Label();
+ this.txtRemoteHost = new System.Windows.Forms.TextBox();
+ this.txtRemotePort = new System.Windows.Forms.TextBox();
+ this.txtLocalPort = new System.Windows.Forms.TextBox();
+ this.lsbOutput = new System.Windows.Forms.ListBox();
+ this.SuspendLayout();
+ //
+ // btnRun
+ //
+ this.btnRun.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnRun.Location = new System.Drawing.Point(356, 368);
+ this.btnRun.Name = "btnRun";
+ this.btnRun.Size = new System.Drawing.Size(83, 45);
+ this.btnRun.TabIndex = 0;
+ this.btnRun.Text = "Run";
+ this.btnRun.UseVisualStyleBackColor = true;
+ this.btnRun.Click += new System.EventHandler(this.btnRun_Click);
+ //
+ // btnStop
+ //
+ this.btnStop.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+ this.btnStop.Location = new System.Drawing.Point(275, 368);
+ this.btnStop.Name = "btnStop";
+ this.btnStop.Size = new System.Drawing.Size(75, 45);
+ this.btnStop.TabIndex = 1;
+ this.btnStop.Text = "Stop";
+ this.btnStop.UseVisualStyleBackColor = true;
+ this.btnStop.Click += new System.EventHandler(this.btnStop_Click);
+ //
+ // lblRemoteHost
+ //
+ this.lblRemoteHost.AutoSize = true;
+ this.lblRemoteHost.Location = new System.Drawing.Point(12, 15);
+ this.lblRemoteHost.Name = "lblRemoteHost";
+ this.lblRemoteHost.Size = new System.Drawing.Size(100, 20);
+ this.lblRemoteHost.TabIndex = 2;
+ this.lblRemoteHost.Text = "RemoteHost";
+ //
+ // lblRemotePort
+ //
+ this.lblRemotePort.AutoSize = true;
+ this.lblRemotePort.Location = new System.Drawing.Point(12, 47);
+ this.lblRemotePort.Name = "lblRemotePort";
+ this.lblRemotePort.Size = new System.Drawing.Size(95, 20);
+ this.lblRemotePort.TabIndex = 3;
+ this.lblRemotePort.Text = "RemotePort";
+ //
+ // lblLocalPort
+ //
+ this.lblLocalPort.AutoSize = true;
+ this.lblLocalPort.Location = new System.Drawing.Point(12, 79);
+ this.lblLocalPort.Name = "lblLocalPort";
+ this.lblLocalPort.Size = new System.Drawing.Size(76, 20);
+ this.lblLocalPort.TabIndex = 4;
+ this.lblLocalPort.Text = "LocalPort";
+ //
+ // txtRemoteHost
+ //
+ this.txtRemoteHost.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.txtRemoteHost.Location = new System.Drawing.Point(118, 12);
+ this.txtRemoteHost.Name = "txtRemoteHost";
+ this.txtRemoteHost.Size = new System.Drawing.Size(321, 26);
+ this.txtRemoteHost.TabIndex = 5;
+ //
+ // txtRemotePort
+ //
+ this.txtRemotePort.Location = new System.Drawing.Point(118, 44);
+ this.txtRemotePort.Name = "txtRemotePort";
+ this.txtRemotePort.Size = new System.Drawing.Size(100, 26);
+ this.txtRemotePort.TabIndex = 6;
+ //
+ // txtLocalPort
+ //
+ this.txtLocalPort.Location = new System.Drawing.Point(118, 76);
+ this.txtLocalPort.Name = "txtLocalPort";
+ this.txtLocalPort.Size = new System.Drawing.Size(100, 26);
+ this.txtLocalPort.TabIndex = 7;
+ //
+ // lsbOutput
+ //
+ this.lsbOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
+ | System.Windows.Forms.AnchorStyles.Left)
+ | System.Windows.Forms.AnchorStyles.Right)));
+ this.lsbOutput.FormattingEnabled = true;
+ this.lsbOutput.ItemHeight = 20;
+ this.lsbOutput.Location = new System.Drawing.Point(12, 108);
+ this.lsbOutput.Name = "lsbOutput";
+ this.lsbOutput.Size = new System.Drawing.Size(427, 244);
+ this.lsbOutput.TabIndex = 8;
+ //
+ // FrmTunnelTCP
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(9F, 20F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.ClientSize = new System.Drawing.Size(451, 425);
+ this.Controls.Add(this.lsbOutput);
+ this.Controls.Add(this.txtLocalPort);
+ this.Controls.Add(this.txtRemotePort);
+ this.Controls.Add(this.txtRemoteHost);
+ this.Controls.Add(this.lblLocalPort);
+ this.Controls.Add(this.lblRemotePort);
+ this.Controls.Add(this.lblRemoteHost);
+ this.Controls.Add(this.btnStop);
+ this.Controls.Add(this.btnRun);
+ this.MinimumSize = new System.Drawing.Size(473, 372);
+ this.Name = "FrmTunnelTCP";
+ this.Text = "TunnelTCP";
+ this.Load += new System.EventHandler(this.FrmTunnelTCP_Load);
+ this.ResumeLayout(false);
+ this.PerformLayout();
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.Button btnRun;
+ private System.Windows.Forms.Button btnStop;
+ private System.Windows.Forms.Label lblRemoteHost;
+ private System.Windows.Forms.Label lblRemotePort;
+ private System.Windows.Forms.Label lblLocalPort;
+ private System.Windows.Forms.TextBox txtRemoteHost;
+ private System.Windows.Forms.TextBox txtRemotePort;
+ private System.Windows.Forms.TextBox txtLocalPort;
+ private System.Windows.Forms.ListBox lsbOutput;
+ }
+}
\ No newline at end of file
diff --git a/VAR.Toolbox/UI/FrmTunnelTCP.cs b/VAR.Toolbox/UI/FrmTunnelTCP.cs
new file mode 100644
index 0000000..f972955
--- /dev/null
+++ b/VAR.Toolbox/UI/FrmTunnelTCP.cs
@@ -0,0 +1,266 @@
+using System;
+using System.Net;
+using System.Net.Sockets;
+using System.Threading;
+using System.Windows.Forms;
+
+namespace VAR.Toolbox.UI
+{
+ public partial class FrmTunnelTCP : Form
+ {
+ private bool _running = false;
+
+ private class ConnectedClient
+ {
+ public string hostRemoto = null;
+ public int puertoRemoto = 0;
+ public Socket socketCliente = null;
+ }
+
+ public FrmTunnelTCP()
+ {
+ InitializeComponent();
+ }
+
+ private void FrmTunnelTCP_Load(object sender, EventArgs e)
+ {
+ btnStop.Enabled = false;
+ btnRun.Enabled = true;
+ }
+
+ private void btnStop_Click(object sender, EventArgs e)
+ {
+ if (_running == false) { return; }
+
+ _running = false;
+ btnStop.Enabled = false;
+ btnRun.Enabled = true;
+ }
+
+ private void btnRun_Click(object sender, EventArgs e)
+ {
+ if (_running == true) { return; }
+
+ _running = true;
+ btnStop.Enabled = true;
+ btnRun.Enabled = false;
+ lsbOutput.Items.Clear();
+
+ string remoteHost = txtRemoteHost.Text;
+ int remotePort = Convert.ToInt32(txtRemotePort.Text);
+ int localPort = Convert.ToInt32(txtLocalPort.Text);
+
+ Thread thread = new Thread(() =>
+ {
+ TunnelTCP(remoteHost, remotePort, localPort);
+ });
+ thread.Start();
+ }
+
+ private void lblOutput_AddText(string text)
+ {
+ if (lsbOutput.InvokeRequired)
+ {
+ lsbOutput.Invoke((MethodInvoker)(() => { lsbOutput.Items.Add(text); }));
+ }
+ else
+ {
+ lsbOutput.Items.Add(text);
+ }
+ }
+
+ private void TunnelTCP(string remoteHost, int remotePort, int localPort)
+ {
+ try
+ {
+ Socket sock;
+
+ sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ sock.Bind(new IPEndPoint(IPAddress.Any, localPort));
+ sock.Listen(1000);
+
+ while (_running)
+ {
+ if (sock.Poll(100, SelectMode.SelectRead))
+ {
+ Socket sockCliente = sock.Accept();
+ sockCliente.Blocking = false;
+ sockCliente.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
+
+ ConnectedClient client = new ConnectedClient
+ {
+ hostRemoto = remoteHost,
+ puertoRemoto = remotePort,
+ socketCliente = sockCliente,
+ };
+ Thread thread = new Thread(() =>
+ {
+ ProcessClient(client);
+ });
+ thread.Start();
+ }
+ }
+
+ sock.Close();
+ }
+ catch (Exception ex)
+ {
+ lblOutput_AddText("Excepcion: " + ex.Message);
+ lblOutput_AddText("Backtrace:");
+ lblOutput_AddText(ex.StackTrace);
+ }
+ }
+
+ private void ProcessClient(ConnectedClient client)
+ {
+ try
+ {
+ Socket remoteSock = null;
+ Socket clientSock = client.socketCliente;
+ bool threadRunning;
+ byte[] buffer = new byte[4096];
+ int len;
+ long totalSent = 0;
+ long totalRecv = 0;
+
+ // Info
+ lblOutput_AddText(
+ DateTime.Now.ToString() +
+ " Nuevo Cliente: " +
+ ((IPEndPoint)clientSock.RemoteEndPoint).Address);
+
+ // Conectar al host remoto
+ IPHostEntry EntryHostRemoto = Dns.GetHostEntry(client.hostRemoto);
+ IPAddress ipHostRemoto = null;
+ foreach (IPAddress addr in EntryHostRemoto.AddressList)
+ {
+ if (addr.AddressFamily == AddressFamily.InterNetwork)
+ {
+ ipHostRemoto = addr;
+ break;
+ }
+ }
+ IPEndPoint endpHostRemoto = new IPEndPoint(ipHostRemoto, client.puertoRemoto);
+ remoteSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ remoteSock.Connect(endpHostRemoto);
+
+ // Bucle de recepcion y envio entre el cliente y el servidor remoto
+ threadRunning = true;
+ while (threadRunning && _running)
+ {
+ // Comprobar recepcion del cliente
+ if (clientSock.Poll(100, SelectMode.SelectRead))
+ {
+ if (clientSock.Available == 0)
+ {
+ // Cliente cierra conexion
+ threadRunning = false;
+ }
+ else
+ {
+ // Obtener y enviar al remoto
+ len = clientSock.Receive(buffer, 0, buffer.Length, 0);
+ int enviado = 0;
+ do
+ {
+ try
+ {
+ enviado = remoteSock.Send(buffer, 0, len, 0);
+ }
+ catch (Exception ex)
+ {
+ lblOutput_AddText("No se pudo enviar... (" + ex.Message + ")");
+ }
+ totalRecv += enviado;
+ } while (enviado <= 0 && remoteSock.Connected);
+ }
+ }
+
+ // Comprobar recepcion del remoto
+ if (remoteSock.Poll(100, SelectMode.SelectRead))
+ {
+ if (remoteSock.Available == 0)
+ {
+ // Remoto cierra conexion
+ threadRunning = false;
+ }
+ else
+ {
+ // Obtener y enviar al cliente
+ len = remoteSock.Receive(buffer, 0, buffer.Length, 0);
+ int enviado = 0;
+ do
+ {
+ try
+ {
+ enviado = clientSock.Send(buffer, 0, len, 0);
+ }
+ catch (Exception ex)
+ {
+ lblOutput_AddText("No se pudo enviar... (" + ex.Message + ")");
+ Thread.Sleep(10);
+ }
+ totalSent += enviado;
+ } while (enviado <= 0 && clientSock.Connected);
+ }
+ }
+ }
+
+ // Info
+ lblOutput_AddText(
+ DateTime.Now.ToString() +
+ " Desconexion de cliente: " +
+ ((IPEndPoint)clientSock.RemoteEndPoint).Address +
+ " IN/OUT: " + UnidadesBytes(totalRecv) + "/" + UnidadesBytes(totalSent));
+
+ // Cerrar conexiones
+ remoteSock.Close();
+ clientSock.Close();
+ }
+ catch (Exception ex)
+ {
+ lblOutput_AddText("Excepcion: " + ex.Message);
+ lblOutput_AddText("Backtrace:");
+ lblOutput_AddText(ex.StackTrace);
+ }
+ }
+
+ public static byte[] StrToByteArray(string str)
+ {
+ System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
+ return encoding.GetBytes(str);
+ }
+
+ private static string UnidadesBytes(long n)
+ {
+ double number = n;
+ if (number < 1024)
+ {
+ return string.Format("{0} B", number);
+ }
+
+ number = number / 1024.0;
+ if (number < 1024)
+ {
+ return string.Format("{0:#.00} KiB", number);
+ }
+
+ number = number / 1024.0;
+ if (number < 1024)
+ {
+ return string.Format("{0:#.00} MiB", number);
+ }
+
+ number = number / 1024.0;
+ if (number < 1024)
+ {
+ return string.Format("{0:#.00} GiB", number);
+ }
+
+ number = number / 1024.0;
+
+ return string.Format("{0:#.00} TiB", number);
+ }
+
+ }
+}
diff --git a/VAR.Toolbox/VAR.Toolbox.csproj b/VAR.Toolbox/VAR.Toolbox.csproj
index 8e3f552..e31b886 100644
--- a/VAR.Toolbox/VAR.Toolbox.csproj
+++ b/VAR.Toolbox/VAR.Toolbox.csproj
@@ -106,6 +106,12 @@
FrmProxyCmd.cs
+
+ Form
+
+
+ FrmTunnelTCP.cs
+
Form