فهرست منبع

Add IPv6 support

Bruce Wayne 5 سال پیش
والد
کامیت
b00b4aa884
3فایلهای تغییر یافته به همراه33 افزوده شده و 8 حذف شده
  1. 0 1
      STUN/Message/Attribute.cs
  2. 18 7
      STUN/Utils/NetUtils.cs
  3. 15 0
      UnitTest/UnitTest.cs

+ 0 - 1
STUN/Message/Attribute.cs

@@ -90,7 +90,6 @@ namespace STUN.Message
                 AttributeType.OtherAddress => new OtherAddressAttribute(),
                 AttributeType.ReflectedFrom => new ReflectedFromAttribute(),
                 AttributeType.ErrorCode => new ErrorCodeAttribute(),
-                //TODO:more
                 _ => new UselessAttribute()
             };
             Value = t.TryParse(value) ? t : null;

+ 18 - 7
STUN/Utils/NetUtils.cs

@@ -15,18 +15,29 @@ namespace STUN.Utils
 
         public static IPEndPoint ParseEndpoint(string str)
         {
-            //TODO:IPv6
             var ipPort = str.Trim().Split(':');
-            if (ipPort.Length == 2)
+            if (ipPort.Length < 2) return null;
+            IPAddress ip = null;
+            if (ipPort.Length == 2 && IPAddress.TryParse(ipPort[0], out ip))
             {
-                if (IPAddress.TryParse(ipPort[0], out var ip))
+                if (!IPAddress.TryParse(ipPort[0], out ip))
                 {
-                    if (ushort.TryParse(ipPort[1], out var port))
-                    {
-                        return new IPEndPoint(ip, port);
-                    }
+                    return null;
                 }
             }
+            else if (ipPort.Length > 2)
+            {
+                var ipStr = string.Join(@":", ipPort, 0, ipPort.Length - 1);
+                if (!ipStr.StartsWith(@"[") || !ipStr.EndsWith(@"]") || !IPAddress.TryParse(ipStr, out ip))
+                {
+                    return null;
+                }
+            }
+
+            if (ip != null && ushort.TryParse(ipPort.Last(), out var port))
+            {
+                return new IPEndPoint(ip, port);
+            }
 
             return null;
         }

+ 15 - 0
UnitTest/UnitTest.cs

@@ -5,6 +5,7 @@ using STUN.Message.Attributes;
 using System.Linq;
 using System.Net;
 using System.Threading.Tasks;
+using STUN.Utils;
 
 namespace UnitTest
 {
@@ -65,6 +66,20 @@ namespace UnitTest
             Assert.IsTrue(_ipv6Response.SequenceEqual(t.Bytes));
         }
 
+        [TestMethod]
+        public void ParseEndpointTest()
+        {
+            Assert.IsNull(NetUtils.ParseEndpoint(@"1.2.3.4"));
+            Assert.IsNull(NetUtils.ParseEndpoint(@"1.2.256.5:80"));
+            Assert.AreEqual(NetUtils.ParseEndpoint(@"0.0.0.0:123"), IPEndPoint.Parse(@"0.0.0.0:123"));
+            Assert.AreEqual(NetUtils.ParseEndpoint(@"192.168.1.1:2136"), IPEndPoint.Parse(@"192.168.1.1:2136"));
+            Assert.AreEqual(NetUtils.ParseEndpoint(@"[2001:db8:1234:5678:11:2233:4455:6677]:32853"), IPEndPoint.Parse(@"[2001:db8:1234:5678:11:2233:4455:6677]:32853"));
+            Assert.IsNull(NetUtils.ParseEndpoint(@"2001:db8:1234:5678:11:2233:4455:6677:32853"));
+            Assert.IsNull(NetUtils.ParseEndpoint(@"2001:db8:1234:5678:11:2233:4455:6677"));
+            Assert.AreEqual(NetUtils.ParseEndpoint(@"[2001:db8:1234:5678:11:2233:4455:6677]:0"), IPEndPoint.Parse(@"[2001:db8:1234:5678:11:2233:4455:6677]:0"));
+            Assert.AreEqual(NetUtils.ParseEndpoint(@"[::1]:0"), IPEndPoint.Parse(@"[::1]:0"));
+        }
+
         [TestMethod]
         public async Task BindingTest()
         {