From 69a8c5eec98ba2eac6ec5497b8a93ba24cb775e8 Mon Sep 17 00:00:00 2001 From: Alan McGovern Date: Wed, 6 Apr 2022 23:17:06 +0100 Subject: [PATCH] First commit --- .editorconfig | 203 ++++++++++++++++++ .gitattributes | 13 ++ .gitignore | 9 + LICENSE.md | 21 ++ Makefile | 17 ++ README.md | 44 ++++ alpha.txt | 2 + build.proj | 61 ++++++ pack.bat | 1 + src/Directory.Build.props | 42 ++++ src/Directory.Build.targets | 46 ++++ src/MonoTorrent.Socks5.sln | 58 +++++ .../MonoTorrent.Socks5.csproj | 56 +++++ src/MonoTorrent.Socks5/Socks5.cs | 61 ++++++ .../Socks5SocketConnector.cs | 21 ++ version.txt | 1 + version_socks5.txt | 1 + 17 files changed, 657 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 LICENSE.md create mode 100644 Makefile create mode 100644 README.md create mode 100644 alpha.txt create mode 100644 build.proj create mode 100644 pack.bat create mode 100644 src/Directory.Build.props create mode 100644 src/Directory.Build.targets create mode 100644 src/MonoTorrent.Socks5.sln create mode 100644 src/MonoTorrent.Socks5/MonoTorrent.Socks5.csproj create mode 100644 src/MonoTorrent.Socks5/Socks5.cs create mode 100644 src/MonoTorrent.Socks5/Socks5SocketConnector.cs create mode 100644 version.txt create mode 100644 version_socks5.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..627931a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,203 @@ +# Remove the line below if you want to inherit .editorconfig settings from higher directories +root = true + +[*] +#### Core EditorConfig Options #### +# Indentation and spacing +indent_size = 4 +indent_style = space +tab_width = 4 +trim_trailing_whitespace = true + +# New line preferences +end_of_line = crlf +insert_final_newline = true + +# MSBuild related files +[*.{csproj,props,targets}] +indent_size = 2 + +# C# files +[*.cs] + +#### .NET Coding Conventions #### + +# Organize usings +dotnet_separate_import_directive_groups = true +dotnet_sort_system_directives_first = true + +# this. and Me. preferences +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = false:silent +dotnet_style_qualification_for_method = false:silent +dotnet_style_qualification_for_property = false:silent + +# Language keywords vs BCL types preferences +dotnet_style_predefined_type_for_locals_parameters_members = true:silent +dotnet_style_predefined_type_for_member_access = true:silent + +# Parentheses preferences +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +# Modifier preferences +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +# Expression-level preferences +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_require_accessibility_modifiers = omit_if_default:silent + +# Field preferences +dotnet_style_readonly_field = true:suggestion + +# Parameter preferences +dotnet_code_quality_unused_parameters = all:suggestion + +#### C# Coding Conventions #### + +# var preferences +csharp_style_var_elsewhere = false:silent +csharp_style_var_for_built_in_types = false:silent +csharp_style_var_when_type_is_apparent = true:silent + +# Expression-bodied members +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = false:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_local_functions = false:silent +csharp_style_expression_bodied_methods = false:silent +csharp_style_expression_bodied_operators = false:silent +csharp_style_expression_bodied_properties = true:silent + +# Pattern matching preferences +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_prefer_switch_expression = true:suggestion + +# Null-checking preferences +csharp_style_conditional_delegate_call = true:suggestion + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async + +# Code-block preferences +csharp_prefer_braces = false:suggestion +csharp_prefer_simple_using_statement = true:suggestion + +# Expression-level preferences +csharp_prefer_simple_default_expression = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_prefer_index_operator = true:suggestion +csharp_style_prefer_range_operator = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_unused_value_assignment_preference = discard_variable:suggestion +csharp_style_unused_value_expression_statement_preference = discard_variable:silent + +# 'using' directive preferences +csharp_using_directive_placement = outside_namespace:silent + +#### C# Formatting Rules #### + +# New line preferences +csharp_new_line_before_catch = false +csharp_new_line_before_else = false +csharp_new_line_before_finally = false +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_open_brace = methods,types +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +# Space preferences +csharp_space_after_cast = true +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = false +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = true +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = true +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Wrapping preferences +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = false + +#### Naming styles #### + +# Naming rules + +dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion +dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface +dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i + +dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.types_should_be_pascal_case.symbols = types +dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case + +dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members +dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case + +# Symbol specifications + +dotnet_naming_symbols.interface.applicable_kinds = interface +dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.interface.required_modifiers = + +dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum +dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.types.required_modifiers = + +dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method +dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected +dotnet_naming_symbols.non_field_members.required_modifiers = + +# Naming styles + +dotnet_naming_style.pascal_case.required_prefix = +dotnet_naming_style.pascal_case.required_suffix = +dotnet_naming_style.pascal_case.word_separator = +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.begins_with_i.required_prefix = I +dotnet_naming_style.begins_with_i.required_suffix = +dotnet_naming_style.begins_with_i.word_separator = +dotnet_naming_style.begins_with_i.capitalization = pascal_case diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..248d2d0 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,13 @@ +*.cs text +*.csproj text +*.dll.config text +*.DotSettings text +*.exe.config text +*.md text +*.proj text +*.props text +*.resx text +*.sh text eol=lf +*.sln text eol=crlf +*.targets text +*.txt text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f27e35d --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.DS_Store +.vs/ +bin/ +obj/ +/src/MonoTorrent.sln.DotSettings.user +/build/ +/out/ +/src/.vs +*.csproj.user diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..d2847b5 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (C) 2022 Alan McGovern + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..219d23c --- /dev/null +++ b/Makefile @@ -0,0 +1,17 @@ + +XBUILD=msbuild +XBUILD_ARGS=/nologo /restore + +all: + @echo Building + $(XBUILD) $(XBUILD_ARGS) + +clean: + @echo Cleaning $(MAIN_SLN) + $(XBUILD) $(XBUILD_ARGS) /t:Clean + +pack: + @echo Creating the nupkg + $(XBUILD) $(XBUILD_ARGS) /t:Pack /p:Configuration=Release + +.PHONY: all clean diff --git a/README.md b/README.md new file mode 100644 index 0000000..d6d7c21 --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +MonoTorrent.Socks5 +======== + +[![NuGet version](https://badge.fury.io/nu/monotorrent.socks5.svg)](https://www.nuget.org/packages/MonoTorrent.Socks5/) + +[![Backers on Open Collective](https://opencollective.com/monotorrent/all/badge.svg?label=Backers)](https://opencollective.com/monotorrent) + + +## JetBrains + +A special thank you to [JetBrains](http://www.jetbrains.com/?from=monotorrent) for supplying a free license to their tooling so I can continue to deliver great features on this opensource project. + +* [dotTrace](http://www.jetbrains.com/dottrace/?from=monotorrent) - Performance profiling +* [dotMemory](http://www.jetbrains.com/dotmemory/?from=monotorrent) - Memory allocation/retention profiling + +## Contributors + +### Code Contributors + +This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. + + +### Financial Contributors + +Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/monotorrent/contribute)] + +#### Individuals + + + +#### Organizations + +Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/monotorrent/contribute)] + + + + + + + + + + + diff --git a/alpha.txt b/alpha.txt new file mode 100644 index 0000000..dede498 --- /dev/null +++ b/alpha.txt @@ -0,0 +1,2 @@ +alpha + diff --git a/build.proj b/build.proj new file mode 100644 index 0000000..768c138 --- /dev/null +++ b/build.proj @@ -0,0 +1,61 @@ + + + + true + false + + Debug + $(MSBuildThisFileDirectory)out + + $(MSBuildCommonProperties);Deterministic=true + + + + + $(Configuration) + + + $(Configuration) + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/pack.bat b/pack.bat new file mode 100644 index 0000000..fde434c --- /dev/null +++ b/pack.bat @@ -0,0 +1 @@ +msbuild /restore /t:Pack /p:Configuration=Release diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..1b13fea --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,42 @@ + + + + + true + false + + 1701;1702;1591;0419;netsdk1138 + + 8.0 + portable + true + true + false + true + annotations + enable + + + False + False + false + + + + version.txt + true + true + $([MSBuild]::GetDirectoryNameOfFileAbove ('$(MSBuildThisFileDirectory)', '$(GitVersionFile)'))\ + + 2.0.0.0 + + + + + <_Parameter1>Tests.$(AssemblyName) + + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 0000000..789dfee --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,46 @@ + + + + + -alpha.unstable + -beta + + !$(ProjectName.StartsWith('Tests')) + + + + + + + + + + + + + + 0.0.0.1 + $(Version) + $(Version) + $(Version)-Debug + + + + + + + + $(GitSemVerMajor).$(GitSemVerMinor).$(GitSemVerPatch) + $(GitBaseVersion) + + $([System.String]::Format('{0:0000}', $([System.Int32]::Parse('$(GitSemVerPatch)')))) + $(MonoTorrentReleaseSuffix).rev$(PaddedSemVerPatch) + $(MonoTorrentFileVersion)-$(GitBranch)+$(GitCommit) + + $(MonoTorrentABIVersion) + $(MonoTorrentFileVersion) + $(MonoTorrentInformationalVersion) + + + + diff --git a/src/MonoTorrent.Socks5.sln b/src/MonoTorrent.Socks5.sln new file mode 100644 index 0000000..ca1e55a --- /dev/null +++ b/src/MonoTorrent.Socks5.sln @@ -0,0 +1,58 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31423.177 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{5B28A9A2-A9AE-4B0E-BD33-38568EA09BCF}" + ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MonoTorrent.Socks5", "MonoTorrent.Socks5\MonoTorrent.Socks5.csproj", "{47BBC475-FA82-4CE1-9458-206C4747071D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {47BBC475-FA82-4CE1-9458-206C4747071D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47BBC475-FA82-4CE1-9458-206C4747071D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47BBC475-FA82-4CE1-9458-206C4747071D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47BBC475-FA82-4CE1-9458-206C4747071D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {FDCCD363-7E21-4AA3-9373-5DCB46A67AD1} + EndGlobalSection + GlobalSection(MonoDevelopProperties) = preSolution + StartupItem = SampleClient\SampleClient.csproj + Policies = $0 + $0.TextStylePolicy = $1 + $1.scope = text/x-csharp + $1.TabsToSpaces = True + $0.CSharpFormattingPolicy = $2 + $2.scope = text/x-csharp + $2.IndentSwitchSection = False + $2.NewLinesForBracesInProperties = False + $2.NewLinesForBracesInAccessors = False + $2.NewLinesForBracesInAnonymousMethods = False + $2.NewLinesForBracesInControlBlocks = False + $2.NewLinesForBracesInAnonymousTypes = False + $2.NewLinesForBracesInObjectCollectionArrayInitializers = False + $2.NewLinesForBracesInLambdaExpressionBody = False + $2.NewLineForElse = False + $2.NewLineForCatch = False + $2.NewLineForFinally = False + $2.NewLineForMembersInObjectInit = False + $2.NewLineForMembersInAnonymousTypes = False + $2.NewLineForClausesInQuery = False + $2.SpacingAfterMethodDeclarationName = True + $2.SpaceAfterMethodCallName = True + $2.SpaceBeforeOpenSquareBracket = True + $0.StandardHeader = $3 + EndGlobalSection +EndGlobal diff --git a/src/MonoTorrent.Socks5/MonoTorrent.Socks5.csproj b/src/MonoTorrent.Socks5/MonoTorrent.Socks5.csproj new file mode 100644 index 0000000..7bf4781 --- /dev/null +++ b/src/MonoTorrent.Socks5/MonoTorrent.Socks5.csproj @@ -0,0 +1,56 @@ + + + + netstandard2.0;netstandard2.1 + version.txt + $([MSBuild]::GetDirectoryNameOfFileAbove ('$(MSBuildThisFileDirectory)', '$(GitVersionFile)'))\ + + $(BeforePack);SetPackProperties + $(TargetsForTfmSpecificBuildOutput) + + + + + + + + + + + + + + + Alan McGovern + + MonoTorrent.Socks5 offers SOCKS 5 proxy support for MonoTorrent. + Notable features include: + - HTTP(s) Tracker support + - Peer connection support + + Pending features: + - UDP tracker support + - DHT support + + MonoTorrent.Socks5 + LICENSE.md + https://github.com/alanmcgovern/monotorrent + false + $(MonoTorrentFileVersion)$(MonoTorrentReleaseSuffix) + bittorrent;torrent;library;tracker;dht;c#;csharp;dotnet;.NET;p2p;socks;proxy;socks5 + + true + true + snupkg + + git + $(GitBranch) + $(GitSha) + https://github.com/alanmcgovern/monotorrent.socks5 + + Alan McGovern + + + + diff --git a/src/MonoTorrent.Socks5/Socks5.cs b/src/MonoTorrent.Socks5/Socks5.cs new file mode 100644 index 0000000..fd60453 --- /dev/null +++ b/src/MonoTorrent.Socks5/Socks5.cs @@ -0,0 +1,61 @@ +using System; +using System.Net; +using System.Net.Http; + +using DotProxify; + +using MonoTorrent.Connections.Peer; +using MonoTorrent.Connections.Tracker; + +namespace MonoTorrent.Connections.Proxy +{ + public class Socks5 : IDisposable + { + ISocketConnector SocketProxy { get; } + + HttpToSocksProxy HttpProxy { get; } + + public Factories Factories { get; } + + public Socks5 (Factories factories, IPEndPoint socksServerEndPoint) + : this( factories, socksServerEndPoint, Array.Empty (), Array.Empty ()) + { + + } + public Socks5 (Factories factories, IPEndPoint socksServerEndPoint, byte[] username, byte[] password) + { + if (factories is null) + throw new ArgumentNullException (nameof (factories)); + if (socksServerEndPoint is null) + throw new ArgumentNullException (nameof (socksServerEndPoint)); + + var server = new Socks5Server (socksServerEndPoint, username, password); + HttpProxy = new HttpToSocksProxy (server); + SocketProxy = new Socks5SocketConnector (server); + + Factories.HttpClientCreator httpClientCreator = () => new HttpClient (new HttpClientHandler { Proxy = HttpProxy, UseProxy = true }); + Factories = factories + .WithHttpClientCreator (httpClientCreator) + .WithSocketConnectorCreator (() => SocketProxy) + .WithPeerConnectionCreator ("ipv4", uri => new SocketPeerConnection (uri, SocketProxy)) + .WithPeerConnectionCreator ("ipv6", uri => new SocketPeerConnection (uri, SocketProxy)) + .WithTrackerCreator ("http", uri => new MonoTorrent.Trackers.Tracker (new HttpTrackerConnection (uri, httpClientCreator ()))) + .WithTrackerCreator ("https", uri => new MonoTorrent.Trackers.Tracker (new HttpTrackerConnection (uri, httpClientCreator ()))) + .WithTrackerCreator ("udp", uri => null) + .WithDhtListenerCreator (port => null) + .WithLocalPeerDiscoveryCreator (() => null) + .WithPeerConnectionListenerCreator (port => null) + ; + } + + public void Initialize () + { + HttpProxy.Start (); + } + + public void Dispose () + { + HttpProxy.Stop (); + } + } +} diff --git a/src/MonoTorrent.Socks5/Socks5SocketConnector.cs b/src/MonoTorrent.Socks5/Socks5SocketConnector.cs new file mode 100644 index 0000000..d336049 --- /dev/null +++ b/src/MonoTorrent.Socks5/Socks5SocketConnector.cs @@ -0,0 +1,21 @@ +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +using DotProxify; +using ReusableTasks; + +namespace MonoTorrent.Connections.Proxy +{ + class Socks5SocketConnector : ISocketConnector + { + Socks5Server SocksServer { get; } + + public Socks5SocketConnector (Socks5Server socksServer) + => SocksServer = socksServer ?? throw new ArgumentNullException (nameof (SocksServer)); + + public ReusableTask ConnectAsync (Uri uri, CancellationToken token) + => SocksServer.ConnectTcp (new IPEndPoint (IPAddress.Parse (uri.Host), uri.Port)); + } +} diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..6e8bf73 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +0.1.0 diff --git a/version_socks5.txt b/version_socks5.txt new file mode 100644 index 0000000..8acdd82 --- /dev/null +++ b/version_socks5.txt @@ -0,0 +1 @@ +0.0.1