📄 linuxnathandler.cs
字号:
namespace NCindy.Protocol.RUDP.NATTraversal
{
using System;
using System.Collections.Generic;
using System.Net;
using System.Runtime.InteropServices;
public sealed class LinuxNATHandler : SymmetricNATHandler
{
public override bool CanHandleNAT(List<NATHistoryPoint> history)
{
bool success = false;
this.MakeTargets(history, out success);
return success;
}
private List<IPEndPoint> MakeTargets(List<NATHistoryPoint> h, out bool success)
{
bool flag = false;
int port = 0;
IPEndPoint point = null;
List<NATHistoryPoint>.Enumerator enumerator = h.GetEnumerator();
try
{
while (enumerator.MoveNext())
{
NATHistoryPoint point2 = enumerator.get_Current();
IPEndPoint localEndPoint = point2.LocalEndPoint;
IPEndPoint peerViewOfLocalEndPoint = point2.PeerViewOfLocalEndPoint;
if ((localEndPoint != null) && (peerViewOfLocalEndPoint != null))
{
flag = localEndPoint.Port == peerViewOfLocalEndPoint.Port;
if (flag)
{
port = localEndPoint.Port;
point = peerViewOfLocalEndPoint;
goto Label_006A;
}
}
}
}
finally
{
enumerator.Dispose();
}
Label_006A:
if (flag)
{
List<NATHistoryPoint> ndps = new List<NATHistoryPoint>();
List<NATHistoryPoint>.Enumerator enumerator2 = h.GetEnumerator();
try
{
while (enumerator2.MoveNext())
{
NATHistoryPoint point5 = enumerator2.get_Current();
if ((point5.PeerViewOfLocalEndPoint != null) && (point5.PeerViewOfLocalEndPoint.Port != port))
{
ndps.Add(point5);
}
}
}
finally
{
enumerator2.Dispose();
}
List<IPEndPoint> list2 = base.PredictPorts(ndps);
list2.Insert(0, point);
success = true;
return list2;
}
success = false;
return null;
}
public override List<IPEndPoint> TargetEndPoints(List<NATHistoryPoint> h)
{
bool success = false;
List<IPEndPoint> list = this.MakeTargets(h, out success);
if (success)
{
return list;
}
return new List<IPEndPoint>();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -