📄 symmetricnathandler.cs
字号:
namespace NCindy.Protocol.RUDP.NATTraversal
{
using System;
using System.Collections.Generic;
using System.Net;
public class SymmetricNATHandler : NATHandler
{
protected static readonly double MAX_STD_DEV = 5;
protected static readonly double SAFETY = 2;
public override bool CanHandleNAT(List<NATHistoryPoint> history)
{
return (0 < this.PredictPorts(history).get_Count());
}
protected List<IPEndPoint> PredictPorts(List<NATHistoryPoint> ndps)
{
int num = 0;
int num2 = -2147483648;
int num3 = -1;
uint num4 = 0;
uint num5 = 0;
bool flag = false;
IPAddress address = null;
List<NATHistoryPoint>.Enumerator enumerator = ndps.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
NATHistoryPoint point = enumerator.get_Current();
if (!(point is SocketClosePoint))
{
IPEndPoint peerViewOfLocalEndPoint = point.PeerViewOfLocalEndPoint;
if (peerViewOfLocalEndPoint != null)
{
int port = peerViewOfLocalEndPoint.Port;
if (!flag)
{
address = peerViewOfLocalEndPoint.Address;
num3 = port;
flag = true;
}
if (num2 > port)
{
uint num7 = (uint) (num2 - port);
num++;
num4 += num7;
num5 += num7 * num7;
}
num2 = port;
}
}
}
}
finally
{
enumerator.Dispose();
}
List<IPEndPoint> list = new List<IPEndPoint>();
if (num > 1)
{
double num8 = num;
double num9 = num4;
double num10 = num9 / num8;
double d = num5 - ((num9 * num9) / num8);
d /= (double) (num - 1);
double num12 = Math.Sqrt(d);
if (num12 >= MAX_STD_DEV)
{
return list;
}
try
{
double num13 = num10 + (SAFETY * num12);
if (num13 < (num10 + 0.001))
{
num13 = num10 + 1.001;
}
for (int i = (int) (num10 - (SAFETY * num12)); i < num13; i++)
{
if (i > 0)
{
int num15 = num3 + i;
list.Add(new IPEndPoint(address, num15));
}
else
{
num13 += 1.001;
}
}
}
catch
{
}
}
return list;
}
public override List<IPEndPoint> TargetEndPoints(List<NATHistoryPoint> history)
{
return this.PredictPorts(history);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -