Browse Source

Fix socks5 proxy

HMBSbige 5 years ago
parent
commit
6888c716bb
3 changed files with 34 additions and 3 deletions
  1. 1 1
      STUN/Proxy/ProxyFactory.cs
  2. 2 1
      STUN/Proxy/Socks5UdpProxy.cs
  3. 31 1
      UnitTest/UnitTest.cs

+ 1 - 1
STUN/Proxy/ProxyFactory.cs

@@ -7,7 +7,7 @@ namespace STUN.Proxy
 {
     public static class ProxyFactory
     {
-        public static IUdpProxy CreateProxy(ProxyType type, IPEndPoint local, IPEndPoint proxy, string user, string password)
+        public static IUdpProxy CreateProxy(ProxyType type, IPEndPoint local, IPEndPoint proxy, string user = null, string password = null)
         {
             return type switch
             {

+ 2 - 1
STUN/Proxy/Socks5UdpProxy.cs

@@ -13,7 +13,7 @@ namespace STUN.Proxy
 {
     public class Socks5UdpProxy : IUdpProxy
     {
-        private readonly TcpClient _assoc = new TcpClient();
+        private readonly TcpClient _assoc;
         private readonly IPEndPoint _socksTcpEndPoint;
 
         private IPEndPoint _assocEndPoint;
@@ -34,6 +34,7 @@ namespace STUN.Proxy
         public Socks5UdpProxy(IPEndPoint local, IPEndPoint proxy)
         {
             _udpClient = local == null ? new UdpClient() : new UdpClient(local);
+            _assoc = new TcpClient(proxy.AddressFamily);
             _socksTcpEndPoint = proxy;
         }
 

+ 31 - 1
UnitTest/UnitTest.cs

@@ -2,10 +2,12 @@
 using STUN.Client;
 using STUN.Enums;
 using STUN.Message.Attributes;
+using STUN.Proxy;
+using STUN.Utils;
+using System;
 using System.Linq;
 using System.Net;
 using System.Threading.Tasks;
-using STUN.Utils;
 
 namespace UnitTest
 {
@@ -153,5 +155,33 @@ namespace UnitTest
                           || result.FilteringBehavior == FilteringBehavior.AddressAndPortDependent
             );
         }
+
+        [TestMethod]
+        public async Task ProxyTest()
+        {
+            var proxy = ProxyFactory.CreateProxy(ProxyType.Socks5, IPEndPoint.Parse(@"0.0.0.0:0"), IPEndPoint.Parse(@"127.0.0.1:10000"));
+            using var client = new StunClient5389UDP(@"stun.syncthing.net", 3478, new IPEndPoint(IPAddress.Any, 0), proxy);
+            var result = await client.QueryAsync();
+
+            Assert.AreEqual(result.BindingTestResult, BindingTestResult.Success);
+            Assert.IsNotNull(result.LocalEndPoint);
+            Assert.IsNotNull(result.PublicEndPoint);
+            Assert.IsNotNull(result.OtherEndPoint);
+            Assert.AreNotEqual(result.LocalEndPoint.Address, IPAddress.Any);
+            Assert.IsTrue(result.MappingBehavior == MappingBehavior.Direct ||
+                          result.MappingBehavior == MappingBehavior.EndpointIndependent ||
+                          result.MappingBehavior == MappingBehavior.AddressDependent ||
+                          result.MappingBehavior == MappingBehavior.AddressAndPortDependent);
+            Assert.IsTrue(result.FilteringBehavior == FilteringBehavior.EndpointIndependent ||
+                          result.FilteringBehavior == FilteringBehavior.AddressDependent ||
+                          result.FilteringBehavior == FilteringBehavior.AddressAndPortDependent);
+
+            Console.WriteLine(result.BindingTestResult);
+            Console.WriteLine(result.MappingBehavior);
+            Console.WriteLine(result.FilteringBehavior);
+            Console.WriteLine(result.OtherEndPoint);
+            Console.WriteLine(result.LocalEndPoint);
+            Console.WriteLine(result.PublicEndPoint);
+        }
     }
 }