Fleshing out the framework to add more proxy server types, authentication and settings.
This commit is contained in:
parent
c87a61b589
commit
06eccde5f4
|
@ -0,0 +1,14 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxyServerSharp.Enums
|
||||
{
|
||||
public enum AuthenticationType
|
||||
{
|
||||
None = 0x00,
|
||||
UsernamePassword = 0x02
|
||||
}
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxyServerSharp.Enums
|
||||
{
|
||||
public enum ProxyType
|
||||
{
|
||||
Http,
|
||||
Tls,
|
||||
Socks4,
|
||||
Socks5
|
||||
}
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
using ProxyServerSharp.Enums;
|
||||
using ProxyServerSharp.Interfaces;
|
||||
using System;
|
||||
|
||||
namespace ProxyServerSharp.Implementation
|
||||
{
|
||||
public class ProxyCoreFactory
|
||||
{
|
||||
public static IProxyCore Create(IProxyServerConfiguration configuration, ProxyType proxyType)
|
||||
{
|
||||
switch(proxyType)
|
||||
{
|
||||
case ProxyType.Socks4:
|
||||
return new Socks4ProxyCore(configuration);
|
||||
case ProxyType.Socks5:
|
||||
return new Socks5ProxyCore(configuration);
|
||||
|
||||
default:
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
using ProxyServerSharp.Enums;
|
||||
using ProxyServerSharp.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxyServerSharp.Implementation
|
||||
{
|
||||
public class ProxyServerConfiguration : IProxyServerConfiguration
|
||||
{
|
||||
public int Port { get; set; }
|
||||
public int TransferUnitSize { get; set; }
|
||||
public AuthenticationType AuthenticationType { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
using ProxyServerSharp.Enums;
|
||||
using ProxyServerSharp.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxyServerSharp.Implementation
|
||||
{
|
||||
class SettingsProxyServerConfiguration : IProxyServerConfiguration
|
||||
{
|
||||
public int Port { get => Properties.Settings.Default.Port; set => Properties.Settings.Default.Port = value; }
|
||||
public int TransferUnitSize { get => Properties.Settings.Default.TransferUnitSize; set => Properties.Settings.Default.TransferUnitSize = value; }
|
||||
public AuthenticationType AuthenticationType { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
|
||||
}
|
||||
}
|
|
@ -14,14 +14,15 @@ namespace ProxyServerSharp.Implementation
|
|||
|
||||
private Socket _serverSocket;
|
||||
|
||||
private bool _running;
|
||||
private Thread _acceptThread;
|
||||
private List<ConnectionInfo> _connections =
|
||||
new List<ConnectionInfo>();
|
||||
|
||||
public Socks4ProxyCore(int port, int transferUnitSize)
|
||||
public Socks4ProxyCore(IProxyServerConfiguration configuration)
|
||||
{
|
||||
_port = port;
|
||||
_transferUnitSize = transferUnitSize;
|
||||
_port = configuration.Port;
|
||||
_transferUnitSize = configuration.TransferUnitSize;
|
||||
}
|
||||
|
||||
public event LocalConnectEventHandler LocalConnect;
|
||||
|
@ -37,6 +38,8 @@ namespace ProxyServerSharp.Implementation
|
|||
{
|
||||
SetupServerSocket();
|
||||
|
||||
_running = true;
|
||||
|
||||
_acceptThread = new Thread(AcceptConnections);
|
||||
_acceptThread.IsBackground = true;
|
||||
_acceptThread.Start();
|
||||
|
@ -44,7 +47,14 @@ namespace ProxyServerSharp.Implementation
|
|||
|
||||
public void Shutdown()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
_running = false;
|
||||
foreach(ConnectionInfo connection in _connections)
|
||||
{
|
||||
connection.LocalSocket.Shutdown(SocketShutdown.Both);
|
||||
connection.LocalSocket.Close();
|
||||
connection.RemoteSocket.Shutdown(SocketShutdown.Both);
|
||||
connection.RemoteSocket.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void SetupServerSocket()
|
||||
|
@ -61,13 +71,18 @@ namespace ProxyServerSharp.Implementation
|
|||
|
||||
private void AcceptConnections()
|
||||
{
|
||||
while (true)
|
||||
while (_running)
|
||||
{
|
||||
// Accept a connection
|
||||
ConnectionInfo connection = new ConnectionInfo();
|
||||
|
||||
Socket socket = _serverSocket.Accept();
|
||||
|
||||
if(_running == false)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
connection.LocalSocket = socket;
|
||||
connection.RemoteSocket = new Socket(AddressFamily.InterNetwork,
|
||||
SocketType.Stream, ProtocolType.Tcp);
|
||||
|
@ -164,7 +179,6 @@ namespace ProxyServerSharp.Implementation
|
|||
}
|
||||
finally
|
||||
{
|
||||
Console.WriteLine("ProcessLocalConnection Cleaning up...");
|
||||
connection.LocalSocket.Close();
|
||||
connection.RemoteSocket.Close();
|
||||
lock (_connections) _connections.Remove(connection);
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
using ProxyServerSharp.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace ProxyServerSharp.Implementation
|
||||
{
|
||||
public class Socks5ProxyCore : IProxyCore
|
||||
{
|
||||
public event LocalConnectEventHandler LocalConnect;
|
||||
public event LocalDisconnectEventHandler LocalDisconnect;
|
||||
public event LocalSentEventHandler LocalSent;
|
||||
public event LocalReceiveEventHandler LocalReceive;
|
||||
public event RemoteConnectEventHandler RemoteConnect;
|
||||
public event RemoteDisconnectEventHandler RemoteDisconnect;
|
||||
public event RemoteSendEventHandler RemoteSend;
|
||||
public event RemoteReceivedEventHandler RemoteReceive;
|
||||
|
||||
private readonly int _port;
|
||||
private readonly int _transferUnitSize;
|
||||
|
||||
public Socks5ProxyCore(IProxyServerConfiguration configuration)
|
||||
{
|
||||
_port = configuration.Port;
|
||||
_transferUnitSize = configuration.TransferUnitSize;
|
||||
}
|
||||
|
||||
public void Shutdown()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public void Start()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
using ProxyServerSharp.Enums;
|
||||
|
||||
namespace ProxyServerSharp.Interfaces
|
||||
{
|
||||
public interface IProxyServerConfiguration
|
||||
{
|
||||
int Port { get; set; }
|
||||
int TransferUnitSize { get; set; }
|
||||
AuthenticationType AuthenticationType { get; set; }
|
||||
}
|
||||
}
|
|
@ -40,9 +40,9 @@
|
|||
//
|
||||
// startProxyButton
|
||||
//
|
||||
this.startProxyButton.Location = new System.Drawing.Point(448, 168);
|
||||
this.startProxyButton.Location = new System.Drawing.Point(615, 441);
|
||||
this.startProxyButton.Name = "startProxyButton";
|
||||
this.startProxyButton.Size = new System.Drawing.Size(64, 24);
|
||||
this.startProxyButton.Size = new System.Drawing.Size(90, 24);
|
||||
this.startProxyButton.TabIndex = 0;
|
||||
this.startProxyButton.Text = "Start";
|
||||
this.startProxyButton.UseVisualStyleBackColor = true;
|
||||
|
@ -72,13 +72,13 @@
|
|||
this.debugTextBox.Multiline = true;
|
||||
this.debugTextBox.Name = "debugTextBox";
|
||||
this.debugTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
|
||||
this.debugTextBox.Size = new System.Drawing.Size(504, 128);
|
||||
this.debugTextBox.Size = new System.Drawing.Size(697, 403);
|
||||
this.debugTextBox.TabIndex = 3;
|
||||
//
|
||||
// transferUnitSizeLabel
|
||||
//
|
||||
this.transferUnitSizeLabel.AutoSize = true;
|
||||
this.transferUnitSizeLabel.Location = new System.Drawing.Point(8, 172);
|
||||
this.transferUnitSizeLabel.Location = new System.Drawing.Point(12, 445);
|
||||
this.transferUnitSizeLabel.Name = "transferUnitSizeLabel";
|
||||
this.transferUnitSizeLabel.Size = new System.Drawing.Size(128, 13);
|
||||
this.transferUnitSizeLabel.TabIndex = 4;
|
||||
|
@ -87,7 +87,7 @@
|
|||
// transferUnitSizeComboBox
|
||||
//
|
||||
this.transferUnitSizeComboBox.FormattingEnabled = true;
|
||||
this.transferUnitSizeComboBox.Location = new System.Drawing.Point(144, 168);
|
||||
this.transferUnitSizeComboBox.Location = new System.Drawing.Point(148, 441);
|
||||
this.transferUnitSizeComboBox.Name = "transferUnitSizeComboBox";
|
||||
this.transferUnitSizeComboBox.Size = new System.Drawing.Size(120, 21);
|
||||
this.transferUnitSizeComboBox.TabIndex = 5;
|
||||
|
@ -95,7 +95,7 @@
|
|||
// portLabel
|
||||
//
|
||||
this.portLabel.AutoSize = true;
|
||||
this.portLabel.Location = new System.Drawing.Point(8, 196);
|
||||
this.portLabel.Location = new System.Drawing.Point(12, 469);
|
||||
this.portLabel.Name = "portLabel";
|
||||
this.portLabel.Size = new System.Drawing.Size(29, 13);
|
||||
this.portLabel.TabIndex = 6;
|
||||
|
@ -103,18 +103,17 @@
|
|||
//
|
||||
// portTextBox
|
||||
//
|
||||
this.portTextBox.Location = new System.Drawing.Point(144, 192);
|
||||
this.portTextBox.Location = new System.Drawing.Point(148, 465);
|
||||
this.portTextBox.Name = "portTextBox";
|
||||
this.portTextBox.Size = new System.Drawing.Size(72, 20);
|
||||
this.portTextBox.Size = new System.Drawing.Size(54, 20);
|
||||
this.portTextBox.TabIndex = 7;
|
||||
this.portTextBox.Text = "1080";
|
||||
this.portTextBox.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
|
||||
//
|
||||
// MainForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(537, 222);
|
||||
this.ClientSize = new System.Drawing.Size(717, 494);
|
||||
this.Controls.Add(this.portTextBox);
|
||||
this.Controls.Add(this.portLabel);
|
||||
this.Controls.Add(this.transferUnitSizeComboBox);
|
||||
|
@ -125,7 +124,7 @@
|
|||
this.Controls.Add(this.startProxyButton);
|
||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
||||
this.Name = "MainForm";
|
||||
this.Text = "SOCKS4 Server ";
|
||||
this.Text = "Multi Proxy Server";
|
||||
this.Load += new System.EventHandler(this.Form1_Load);
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
|
|
@ -12,7 +12,7 @@ namespace ProxyServerSharp
|
|||
{
|
||||
public partial class MainForm : Form
|
||||
{
|
||||
Socks4ProxyCore _proxyCore;
|
||||
IProxyCore _proxyCore;
|
||||
|
||||
public MainForm()
|
||||
{
|
||||
|
@ -53,17 +53,26 @@ namespace ProxyServerSharp
|
|||
{
|
||||
if (startProxyButton.Text == "Start")
|
||||
{
|
||||
_proxyCore = new Socks4ProxyCore(int.Parse(portTextBox.Text),
|
||||
int.Parse((string)transferUnitSizeComboBox.SelectedItem));
|
||||
var config = new ProxyServerConfiguration()
|
||||
{
|
||||
Port = int.Parse(portTextBox.Text),
|
||||
TransferUnitSize = int.Parse((string)transferUnitSizeComboBox.SelectedItem)
|
||||
};
|
||||
|
||||
_proxyCore = ProxyCoreFactory.Create(config, Enums.ProxyType.Socks4);
|
||||
_proxyCore.LocalConnect += new LocalConnectEventHandler(server_LocalConnect);
|
||||
_proxyCore.RemoteConnect += new RemoteConnectEventHandler(server_RemoteConnect);
|
||||
_proxyCore.Start();
|
||||
|
||||
statusLabel.Text = "Started";
|
||||
startProxyButton.Text = "Stop";
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
_proxyCore.Shutdown();
|
||||
|
||||
statusLabel.Text = "Stopped";
|
||||
startProxyButton.Text = "Start";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -112,9 +112,9 @@
|
|||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
|
@ -22,5 +22,29 @@ namespace ProxyServerSharp.Properties {
|
|||
return defaultInstance;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("1080")]
|
||||
public int Port {
|
||||
get {
|
||||
return ((int)(this["Port"]));
|
||||
}
|
||||
set {
|
||||
this["Port"] = value;
|
||||
}
|
||||
}
|
||||
|
||||
[global::System.Configuration.UserScopedSettingAttribute()]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Configuration.DefaultSettingValueAttribute("4096")]
|
||||
public int TransferUnitSize {
|
||||
get {
|
||||
return ((int)(this["TransferUnitSize"]));
|
||||
}
|
||||
set {
|
||||
this["TransferUnitSize"] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
<?xml version='1.0' encoding='utf-8'?>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)">
|
||||
<Profiles>
|
||||
<Profile Name="(Default)" />
|
||||
</Profiles>
|
||||
<Settings />
|
||||
</SettingsFile>
|
||||
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="ProxyServerSharp.Properties" GeneratedClassName="Settings">
|
||||
<Profiles />
|
||||
<Settings>
|
||||
<Setting Name="Port" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">1080</Value>
|
||||
</Setting>
|
||||
<Setting Name="TransferUnitSize" Type="System.Int32" Scope="User">
|
||||
<Value Profile="(Default)">4096</Value>
|
||||
</Setting>
|
||||
</Settings>
|
||||
</SettingsFile>
|
|
@ -47,8 +47,15 @@
|
|||
<Reference Include="System.Xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Enums\AuthenticationType.cs" />
|
||||
<Compile Include="Implementation\ConnectionInfo.cs" />
|
||||
<Compile Include="Implementation\ProxyCoreFactory.cs" />
|
||||
<Compile Include="Enums\ProxyType.cs" />
|
||||
<Compile Include="Implementation\ProxyServerConfiguration.cs" />
|
||||
<Compile Include="Implementation\SettingsProxyServerConfiguration.cs" />
|
||||
<Compile Include="Implementation\Socks5ProxyCore.cs" />
|
||||
<Compile Include="Interfaces\IProxyCore.cs" />
|
||||
<Compile Include="Interfaces\IProxyServerConfiguration.cs" />
|
||||
<Compile Include="MainForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
|
|
|
@ -1,3 +1,18 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup></configuration>
|
||||
<configSections>
|
||||
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
|
||||
<section name="ProxyServerSharp.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
|
||||
</sectionGroup>
|
||||
</configSections>
|
||||
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1"/></startup><userSettings>
|
||||
<ProxyServerSharp.Properties.Settings>
|
||||
<setting name="Port" serializeAs="String">
|
||||
<value>1080</value>
|
||||
</setting>
|
||||
<setting name="TransferUnitSize" serializeAs="String">
|
||||
<value>4096</value>
|
||||
</setting>
|
||||
</ProxyServerSharp.Properties.Settings>
|
||||
</userSettings>
|
||||
</configuration>
|
||||
|
|
Loading…
Reference in New Issue