mirror of
https://github.com/snltty/linker.git
synced 2025-11-03 01:53:32 +08:00
一些更新
This commit is contained in:
2
.github/workflows/dotnet.yml
vendored
2
.github/workflows/dotnet.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
||||
release_name: v1.6.1.${{ steps.date.outputs.today }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
body: "1. 优化中继节点\r\n2. 优化虚拟网口的端口转发,仅有变化时重建列表\r\n3. 优化网点对网和网对网,目标下线后,更新路由\r\n4. 优化端口转发,端口监听失败多尝试几次\r\n5. 新增PCP,以客户端为中继节点"
|
||||
body: "1. 优化中继节点\r\n2. 优化虚拟网卡的端口转发,仅有变化时重建列表\r\n3. 优化网点对网和网对网,目标下线后,更新路由\r\n4. 优化端口转发,端口监听失败多尝试几次\r\n5. 测试中。。"
|
||||
- name: upload-win-x86-oss
|
||||
id: upload-win-x86-oss
|
||||
uses: tvrcgo/oss-action@v0.1.1
|
||||
|
||||
@@ -101,6 +101,7 @@ namespace linker.libs
|
||||
|
||||
public void Enqueue(LoggerModel model)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(model.Content)) return;
|
||||
queue.Enqueue(model);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ using System.Collections.Concurrent;
|
||||
using System.Net.Sockets;
|
||||
using System.Net;
|
||||
using linker.tunnel.wanport;
|
||||
using System.Collections.Generic;
|
||||
using System.Transactions;
|
||||
|
||||
namespace linker.tunnel
|
||||
{
|
||||
@@ -137,6 +137,18 @@ namespace linker.tunnel
|
||||
/// <param name="denyProtocols">本次连接排除那些打洞协议</param>
|
||||
/// <returns></returns>
|
||||
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols)
|
||||
{
|
||||
return await ConnectAsync(remoteMachineId, transactionId, transactionId, denyProtocols);
|
||||
}
|
||||
/// <summary>
|
||||
/// 开始连接对方
|
||||
/// </summary>
|
||||
/// <param name="remoteMachineId">对方id</param>
|
||||
/// <param name="transactionId">事务id,随便起,你喜欢就好</param>
|
||||
/// <param name="transactionTag">事务tag,随便起,你喜欢就好</param>
|
||||
/// <param name="denyProtocols">本次连接排除那些打洞协议</param>
|
||||
/// <returns></returns>
|
||||
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, string transactionTag, TunnelProtocolType denyProtocols)
|
||||
{
|
||||
if (connectingDic.TryAdd(remoteMachineId, true) == false) return null;
|
||||
|
||||
@@ -200,12 +212,13 @@ namespace linker.tunnel
|
||||
{
|
||||
Direction = (TunnelDirection)i,
|
||||
TransactionId = transactionId,
|
||||
TransactionTag = transactionTag,
|
||||
TransportName = transport.Name,
|
||||
TransportType = transport.ProtocolType,
|
||||
Local = localInfo.Result,
|
||||
Remote = remoteInfo.Result,
|
||||
SSL = transportItem.SSL,
|
||||
FlowId = Interlocked.Increment(ref flowid)
|
||||
FlowId = Interlocked.Increment(ref flowid),
|
||||
};
|
||||
OnConnecting(tunnelTransportInfo);
|
||||
ParseRemoteEndPoint(tunnelTransportInfo);
|
||||
@@ -440,7 +453,6 @@ namespace linker.tunnel
|
||||
}
|
||||
TimerHelper.Async(async () =>
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
ITunnelConnection connection = null;
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace linker.tunnel.connection
|
||||
{
|
||||
P2P = 0,
|
||||
Relay = 1,
|
||||
Node = 2,
|
||||
}
|
||||
/// <summary>
|
||||
/// 隧道方向
|
||||
@@ -82,6 +83,10 @@ namespace linker.tunnel.connection
|
||||
/// </summary>
|
||||
public string TransactionId { get; }
|
||||
/// <summary>
|
||||
/// 事务标签
|
||||
/// </summary>
|
||||
public string TransactionTag { get; }
|
||||
/// <summary>
|
||||
/// 协议
|
||||
/// </summary>
|
||||
public string TransportName { get; }
|
||||
|
||||
@@ -21,6 +21,7 @@ namespace linker.tunnel.connection
|
||||
public string RemoteMachineId { get; init; }
|
||||
public string RemoteMachineName { get; init; }
|
||||
public string TransactionId { get; init; }
|
||||
public string TransactionTag { get; init; }
|
||||
public string TransportName { get; init; }
|
||||
public string Label { get; init; }
|
||||
public TunnelMode Mode { get; init; }
|
||||
|
||||
@@ -18,6 +18,7 @@ namespace linker.tunnel.connection
|
||||
public string RemoteMachineId { get; init; }
|
||||
public string RemoteMachineName { get; init; }
|
||||
public string TransactionId { get; init; }
|
||||
public string TransactionTag { get; init; }
|
||||
public string TransportName { get; init; }
|
||||
public string Label { get; init; }
|
||||
public TunnelMode Mode { get; init; }
|
||||
|
||||
@@ -17,6 +17,7 @@ namespace linker.tunnel.connection
|
||||
public string RemoteMachineId { get; init; }
|
||||
public string RemoteMachineName { get; init; }
|
||||
public string TransactionId { get; init; }
|
||||
public string TransactionTag { get; init; }
|
||||
public string TransportName { get; init; }
|
||||
public string Label { get; init; }
|
||||
public TunnelMode Mode { get; init; }
|
||||
|
||||
@@ -171,19 +171,7 @@ namespace linker.tunnel.transport
|
||||
/// </summary>
|
||||
public byte Order { get; set; }
|
||||
}
|
||||
public sealed class TunnelTransportItemInfoEqualityComparer : IEqualityComparer<TunnelTransportItemInfo>
|
||||
{
|
||||
public bool Equals(TunnelTransportItemInfo x, TunnelTransportItemInfo y)
|
||||
{
|
||||
return x.Name == y.Name;
|
||||
}
|
||||
|
||||
public int GetHashCode(TunnelTransportItemInfo obj)
|
||||
{
|
||||
return obj.Name.GetHashCode();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public sealed partial class TunnelTransportInfo
|
||||
{
|
||||
/// <summary>
|
||||
@@ -225,6 +213,11 @@ namespace linker.tunnel.transport
|
||||
/// </summary>
|
||||
public uint FlowId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标签
|
||||
/// </summary>
|
||||
public string TransactionTag { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 目标ip列表
|
||||
/// </summary>
|
||||
|
||||
@@ -244,6 +244,7 @@ namespace linker.tunnel.transport
|
||||
Connection = connection,
|
||||
IPEndPoint = remoteEP,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
RemoteMachineId = tunnelTransportInfo.Remote.MachineId,
|
||||
RemoteMachineName = tunnelTransportInfo.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
@@ -635,6 +636,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = state.TransactionId,
|
||||
TransactionTag = state.TransactionTag,
|
||||
TransportName = state.TransportName,
|
||||
IPEndPoint = remoteEP,
|
||||
Label = string.Empty,
|
||||
|
||||
@@ -195,6 +195,7 @@ namespace linker.tunnel.transport
|
||||
Socket = targetSocket,
|
||||
IPEndPoint = targetSocket.RemoteEndPoint as IPEndPoint,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
RemoteMachineId = tunnelTransportInfo.Remote.MachineId,
|
||||
RemoteMachineName = tunnelTransportInfo.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
@@ -296,6 +297,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = _state.TransactionId,
|
||||
TransactionTag = _state.TransactionTag,
|
||||
TransportName = _state.TransportName,
|
||||
IPEndPoint = socket.RemoteEndPoint as IPEndPoint,
|
||||
Label = string.Empty,
|
||||
|
||||
@@ -180,6 +180,7 @@ namespace linker.tunnel.transport
|
||||
Socket = socket,
|
||||
IPEndPoint = socket.RemoteEndPoint as IPEndPoint,
|
||||
TransactionId = state.TransactionId,
|
||||
TransactionTag = state.TransactionTag,
|
||||
RemoteMachineId = state.Remote.MachineId,
|
||||
RemoteMachineName = state.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
@@ -235,6 +236,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = state.TransactionId,
|
||||
TransactionTag = state.TransactionTag,
|
||||
TransportName = state.TransportName,
|
||||
IPEndPoint = socket.RemoteEndPoint as IPEndPoint,
|
||||
Label = string.Empty,
|
||||
|
||||
@@ -264,6 +264,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
TransportName = tunnelTransportInfo.TransportName,
|
||||
IPEndPoint = socket.RemoteEndPoint as IPEndPoint,
|
||||
Label = string.Empty,
|
||||
@@ -318,6 +319,7 @@ namespace linker.tunnel.transport
|
||||
Socket = targetSocket,
|
||||
IPEndPoint = targetSocket.RemoteEndPoint as IPEndPoint,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
RemoteMachineId = tunnelTransportInfo.Remote.MachineId,
|
||||
RemoteMachineName = tunnelTransportInfo.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
|
||||
@@ -179,6 +179,7 @@ namespace linker.tunnel.transport
|
||||
UdpClient = remoteUdp,
|
||||
IPEndPoint = remoteEP,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
RemoteMachineId = tunnelTransportInfo.Remote.MachineId,
|
||||
RemoteMachineName = tunnelTransportInfo.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
@@ -401,6 +402,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = state.TransactionId,
|
||||
TransactionTag = state.TransactionTag,
|
||||
TransportName = state.TransportName,
|
||||
IPEndPoint = remoteEP,
|
||||
Label = string.Empty,
|
||||
|
||||
@@ -264,6 +264,7 @@ namespace linker.tunnel.transport
|
||||
Type = TunnelType.P2P,
|
||||
Mode = TunnelMode.Server,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
TransportName = tunnelTransportInfo.TransportName,
|
||||
IPEndPoint = state.RemoteEndPoint,
|
||||
Label = string.Empty,
|
||||
@@ -317,6 +318,7 @@ namespace linker.tunnel.transport
|
||||
{
|
||||
IPEndPoint = ep,
|
||||
TransactionId = tunnelTransportInfo.TransactionId,
|
||||
TransactionTag = tunnelTransportInfo.TransactionTag,
|
||||
RemoteMachineId = tunnelTransportInfo.Remote.MachineId,
|
||||
RemoteMachineName = tunnelTransportInfo.Remote.MachineName,
|
||||
TransportName = Name,
|
||||
|
||||
@@ -134,7 +134,7 @@ export default {
|
||||
const state = reactive({
|
||||
show: true,
|
||||
protocolTypes:{1:'tcp',2:'udp',4:'msquic'},
|
||||
types:{0:'打洞',1:'中继'},
|
||||
types:{0:'打洞',1:'中继',2:'节点'},
|
||||
transactions:{'forward':'端口转发','tuntap':'虚拟网卡','socks5':'代理转发'},
|
||||
machineName:connections.value.currentName,
|
||||
currentRow:{},
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<span class="point relay" title="中继连接"></span>
|
||||
</template>
|
||||
<template v-else-if="connections.list[scope.row.MachineId].Type == 2">
|
||||
<span class="point node" title="中继连接"></span>
|
||||
<span class="point node" title="节点连接"></span>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
@@ -38,7 +38,7 @@
|
||||
<span class="point relay" title="中继连接"></span>
|
||||
</template>
|
||||
<template v-else-if="connections.list[scope.row.MachineId].Type == 2">
|
||||
<span class="point node" title="中继连接"></span>
|
||||
<span class="point node" title="节点连接"></span>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<span class="point relay" title="中继连接"></span>
|
||||
</template>
|
||||
<template v-else-if="connections.list[item.MachineId].Type == 2">
|
||||
<span class="point node" title="中继连接"></span>
|
||||
<span class="point node" title="节点连接"></span>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<span class="point relay" title="中继连接"></span>
|
||||
</template>
|
||||
<template v-else-if="connections.list[item.MachineId].Type == 2">
|
||||
<span class="point node" title="中继连接"></span>
|
||||
<span class="point node" title="节点连接"></span>
|
||||
</template>
|
||||
</template>
|
||||
<template v-else>
|
||||
|
||||
@@ -22,10 +22,10 @@
|
||||
<Authors>snltty</Authors>
|
||||
<Company>snltty</Company>
|
||||
<Description>1. 优化中继节点
|
||||
2. 优化虚拟网口的端口转发,仅有变化时重建列表
|
||||
2. 优化虚拟网卡的端口转发,仅有变化时重建列表
|
||||
3. 优化网点对网和网对网,目标下线后,更新路由
|
||||
4. 优化端口转发,端口监听失败多尝试几次
|
||||
5. 新增PCP,以客户端为中继节点</Description>
|
||||
5. 测试中。。</Description>
|
||||
<Copyright>snltty</Copyright>
|
||||
<PackageProjectUrl>https://github.com/snltty/linker</PackageProjectUrl>
|
||||
<RepositoryUrl>https://github.com/snltty/linker</RepositoryUrl>
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace linker.plugins.forward
|
||||
this.messengerSender = messengerSender;
|
||||
|
||||
clientSignInState.NetworkEnabledHandle += Reset;
|
||||
|
||||
CheckTask();
|
||||
|
||||
}
|
||||
|
||||
@@ -94,69 +94,95 @@ namespace linker.plugins.forward
|
||||
groupid = fileConfig.Data.Client.Group.Id;
|
||||
|
||||
await Task.Delay(5000).ConfigureAwait(false);
|
||||
Start(10);
|
||||
Start(false);
|
||||
});
|
||||
}
|
||||
|
||||
private void Start(int times = 1)
|
||||
private void CheckTask()
|
||||
{
|
||||
uint maxid = running.Data.Forwards.Count > 0 ? running.Data.Forwards.Max(c => c.Id) : 1;
|
||||
ns.Reset(maxid);
|
||||
|
||||
foreach (var item in running.Data.Forwards.Where(c => c.GroupId == fileConfig.Data.Client.Group.Id))
|
||||
TimerHelper.SetInterval(() =>
|
||||
{
|
||||
if (item.Started)
|
||||
lock (this)
|
||||
{
|
||||
Start(item, times);
|
||||
var items = running.Data.Forwards
|
||||
.Where(c => c.GroupId == fileConfig.Data.Client.Group.Id)
|
||||
.Where(c => c.Started && c.Proxy == false && string.IsNullOrWhiteSpace(c.Msg) == false);
|
||||
foreach (var item in items)
|
||||
{
|
||||
Start(item, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
return true;
|
||||
}, 30000);
|
||||
}
|
||||
private void Start(bool errorStop = true)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
uint maxid = running.Data.Forwards.Count > 0 ? running.Data.Forwards.Max(c => c.Id) : 1;
|
||||
ns.Reset(maxid);
|
||||
|
||||
foreach (var item in running.Data.Forwards.Where(c => c.GroupId == fileConfig.Data.Client.Group.Id))
|
||||
{
|
||||
Stop(item);
|
||||
if (item.Started)
|
||||
{
|
||||
Start(item, errorStop);
|
||||
}
|
||||
else
|
||||
{
|
||||
Stop(item);
|
||||
}
|
||||
}
|
||||
DataVersion.Add();
|
||||
}
|
||||
}
|
||||
private void Start(ForwardInfo forwardInfo, bool errorStop = true)
|
||||
{
|
||||
if (forwardInfo.Proxy == false)
|
||||
{
|
||||
try
|
||||
{
|
||||
forwardProxy.Start(new System.Net.IPEndPoint(forwardInfo.BindIPAddress, forwardInfo.Port), forwardInfo.TargetEP, forwardInfo.MachineId, forwardInfo.BufferSize);
|
||||
forwardInfo.Port = forwardProxy.LocalEndpoint.Port;
|
||||
|
||||
if (forwardInfo.Port > 0)
|
||||
{
|
||||
forwardInfo.Started = true;
|
||||
forwardInfo.Proxy = true;
|
||||
forwardInfo.Msg = string.Empty;
|
||||
LoggerHelper.Instance.Debug($"start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP}");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (errorStop)
|
||||
{
|
||||
forwardInfo.Started = false;
|
||||
}
|
||||
forwardInfo.Msg = $"start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP} fail";
|
||||
LoggerHelper.Instance.Error(forwardInfo.Msg);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
if (errorStop)
|
||||
{
|
||||
forwardInfo.Started = false;
|
||||
}
|
||||
forwardInfo.Msg = $"{ex.Message},start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP} fail";
|
||||
LoggerHelper.Instance.Error(ex);
|
||||
}
|
||||
}
|
||||
DataVersion.Add();
|
||||
}
|
||||
private void Start(ForwardInfo forwardInfo,int times = 1)
|
||||
{
|
||||
TimerHelper.Async(async () =>
|
||||
{
|
||||
for (int i = 0; i < times && forwardInfo.Proxy == false; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
forwardProxy.Start(new System.Net.IPEndPoint(forwardInfo.BindIPAddress, forwardInfo.Port), forwardInfo.TargetEP, forwardInfo.MachineId, forwardInfo.BufferSize);
|
||||
forwardInfo.Port = forwardProxy.LocalEndpoint.Port;
|
||||
|
||||
if (forwardInfo.Port > 0)
|
||||
{
|
||||
forwardInfo.Proxy = true;
|
||||
forwardInfo.Msg = string.Empty;
|
||||
LoggerHelper.Instance.Debug($"start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP}");
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
forwardInfo.Msg = $"start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP} fail, retry times {times-i}";
|
||||
LoggerHelper.Instance.Error(forwardInfo.Msg);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
forwardInfo.Msg = $"{ex.Message},start forward {forwardInfo.Port}->{forwardInfo.MachineId}->{forwardInfo.TargetEP} fail, retry times {times - i}";
|
||||
LoggerHelper.Instance.Error(ex);
|
||||
}
|
||||
await Task.Delay(10000);
|
||||
}
|
||||
|
||||
Version.Add();
|
||||
});
|
||||
Version.Add();
|
||||
}
|
||||
|
||||
private void Stop()
|
||||
{
|
||||
foreach (var item in running.Data.Forwards)
|
||||
lock (this)
|
||||
{
|
||||
Stop(item);
|
||||
foreach (var item in running.Data.Forwards)
|
||||
{
|
||||
Stop(item);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void Stop(ForwardInfo forwardInfo)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.config;
|
||||
using linker.plugins.pcp.messenger;
|
||||
using linker.startup;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
@@ -22,10 +23,13 @@ namespace linker.plugins.pcp
|
||||
{
|
||||
serviceCollection.AddSingleton<PcpConfigTransfer>();
|
||||
serviceCollection.AddSingleton<PcpTransfer>();
|
||||
|
||||
serviceCollection.AddSingleton<PcpClientMessenger>();
|
||||
}
|
||||
|
||||
public void AddServer(ServiceCollection serviceCollection, FileConfig config)
|
||||
{
|
||||
serviceCollection.AddSingleton<PcpServerMessenger>();
|
||||
}
|
||||
|
||||
public void UseClient(ServiceProvider serviceProvider, FileConfig config)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using linker.libs;
|
||||
using linker.libs.extends;
|
||||
using linker.tunnel;
|
||||
using linker.tunnel.connection;
|
||||
|
||||
@@ -17,8 +18,13 @@ namespace linker.plugins.pcp
|
||||
|
||||
tunnelTransfer.SetConnectedCallback(transactionId, OnConnected);
|
||||
}
|
||||
|
||||
private void OnConnected(ITunnelConnection connection)
|
||||
{
|
||||
TunnelTagInfo tag = connection.TransactionTag.DeJson<TunnelTagInfo>();
|
||||
|
||||
//connection.TransactionId = tag.OriginTransactionId;
|
||||
// connection.Type = TunnelType.Node;
|
||||
if (OnConnectedCallbacks.TryGetValue(Helper.GlobalString, out List<Action<ITunnelConnection>> callbacks))
|
||||
{
|
||||
foreach (var item in callbacks)
|
||||
@@ -34,18 +40,12 @@ namespace linker.plugins.pcp
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<ITunnelConnection> ConnectAsync(string remoteMachineId, string transactionId, TunnelProtocolType denyProtocols)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return null;
|
||||
}
|
||||
|
||||
public void AddConnection(ITunnelConnection connection)
|
||||
{
|
||||
pcpConfigTransfer.AddConnection(connection);
|
||||
}
|
||||
|
||||
private Dictionary<string, List<Action<ITunnelConnection>>> OnConnectedCallbacks { get; } = new Dictionary<string, List<Action<ITunnelConnection>>>();
|
||||
/// <summary>
|
||||
/// 设置成功回调
|
||||
@@ -75,5 +75,25 @@ namespace linker.plugins.pcp
|
||||
}
|
||||
|
||||
|
||||
public void AddConnection(ITunnelConnection connection)
|
||||
{
|
||||
pcpConfigTransfer.AddConnection(connection);
|
||||
}
|
||||
|
||||
sealed class TunnelTagInfo
|
||||
{
|
||||
/// <summary>
|
||||
/// 节点id
|
||||
/// </summary>
|
||||
public string NodeId { get; set; }
|
||||
/// <summary>
|
||||
/// 原本的事务id
|
||||
/// </summary>
|
||||
public string TransactionId { get; set; }
|
||||
/// <summary>
|
||||
/// 是哪边的,l 和 r
|
||||
/// </summary>
|
||||
public char Side { get; set; } = 'l';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
107
linker/plugins/pcp/messenger/PcpMessenger.cs
Normal file
107
linker/plugins/pcp/messenger/PcpMessenger.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using linker.plugins.signin.messenger;
|
||||
using linker.tunnel;
|
||||
using linker.tunnel.transport;
|
||||
using linker.libs;
|
||||
using MemoryPack;
|
||||
using linker.plugins.messenger;
|
||||
|
||||
namespace linker.plugins.pcp.messenger
|
||||
{
|
||||
public sealed class PcpClientMessenger : IMessenger
|
||||
{
|
||||
private readonly TunnelTransfer tunnel;
|
||||
private readonly IMessengerSender messengerSender;
|
||||
|
||||
public PcpClientMessenger(TunnelTransfer tunnel, IMessengerSender messengerSender)
|
||||
{
|
||||
this.tunnel = tunnel;
|
||||
this.messengerSender = messengerSender;
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Begin)]
|
||||
public void Begin(IConnection connection)
|
||||
{
|
||||
connection.Write(Helper.TrueArray);
|
||||
}
|
||||
|
||||
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Fail)]
|
||||
public void Fail(IConnection connection)
|
||||
{
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.Success)]
|
||||
public void Success(IConnection connection)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
public sealed class PcpServerMessenger : IMessenger
|
||||
{
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly SignCaching signCaching;
|
||||
public PcpServerMessenger(IMessengerSender messengerSender, SignCaching signCaching)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
this.signCaching = signCaching;
|
||||
}
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.BeginForward)]
|
||||
public async Task BeginForward(IConnection connection)
|
||||
{
|
||||
TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
|
||||
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cacheTo) && signCaching.TryGet(connection.Id, out SignCacheInfo cacheFrom) && cacheFrom.GroupId == cacheTo.GroupId)
|
||||
{
|
||||
tunnelTransportInfo.Local.MachineName = cacheFrom.MachineName;
|
||||
tunnelTransportInfo.Remote.MachineName = cacheTo.MachineName;
|
||||
|
||||
await messengerSender.SendOnly(new MessageRequestWrap
|
||||
{
|
||||
Connection = cacheTo.Connection,
|
||||
MessengerId = (ushort)PcpMessengerIds.Begin,
|
||||
Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo)
|
||||
}).ConfigureAwait(false);
|
||||
connection.Write(Helper.TrueArray);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.FailForward)]
|
||||
public async Task FailForward(IConnection connection)
|
||||
{
|
||||
TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
|
||||
{
|
||||
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
|
||||
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
|
||||
await messengerSender.SendOnly(new MessageRequestWrap
|
||||
{
|
||||
Connection = cache.Connection,
|
||||
MessengerId = (ushort)PcpMessengerIds.Fail,
|
||||
Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo)
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[MessengerId((ushort)PcpMessengerIds.SuccessForward)]
|
||||
public async Task SuccessForward(IConnection connection)
|
||||
{
|
||||
TunnelTransportInfo tunnelTransportInfo = MemoryPackSerializer.Deserialize<TunnelTransportInfo>(connection.ReceiveRequestWrap.Payload.Span);
|
||||
if (signCaching.TryGet(tunnelTransportInfo.Remote.MachineId, out SignCacheInfo cache) && signCaching.TryGet(connection.Id, out SignCacheInfo cache1) && cache.GroupId == cache1.GroupId)
|
||||
{
|
||||
tunnelTransportInfo.Local.MachineName = cache1.MachineName;
|
||||
tunnelTransportInfo.Remote.MachineName = cache.MachineName;
|
||||
await messengerSender.SendOnly(new MessageRequestWrap
|
||||
{
|
||||
Connection = cache.Connection,
|
||||
MessengerId = (ushort)PcpMessengerIds.Success,
|
||||
Payload = MemoryPackSerializer.Serialize(tunnelTransportInfo)
|
||||
}).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
18
linker/plugins/pcp/messenger/PcpMessengerIds.cs
Normal file
18
linker/plugins/pcp/messenger/PcpMessengerIds.cs
Normal file
@@ -0,0 +1,18 @@
|
||||
namespace linker.plugins.pcp.messenger
|
||||
{
|
||||
public enum PcpMessengerIds : ushort
|
||||
{
|
||||
_ = 3100,
|
||||
|
||||
Begin = 3101,
|
||||
BeginForward = 3102,
|
||||
|
||||
Fail = 3103,
|
||||
FailForward = 3104,
|
||||
|
||||
Success = 3105,
|
||||
SuccessForward = 3106,
|
||||
|
||||
None = 3199
|
||||
}
|
||||
}
|
||||
@@ -127,16 +127,15 @@ namespace linker.plugins.sforward
|
||||
if (sForwardAddResultInfo.Success)
|
||||
{
|
||||
forwardInfo.Proxy = true;
|
||||
LoggerHelper.Instance.Debug(sForwardAddResultInfo.Message);
|
||||
forwardInfo.Msg = string.Empty;
|
||||
LoggerHelper.Instance.Debug(sForwardAddResultInfo.Message);
|
||||
}
|
||||
else
|
||||
{
|
||||
forwardInfo.Started = false;
|
||||
LoggerHelper.Instance.Error(sForwardAddResultInfo.Message);
|
||||
forwardInfo.Msg = sForwardAddResultInfo.Message;
|
||||
LoggerHelper.Instance.Error(sForwardAddResultInfo.Message);
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -66,10 +66,6 @@ namespace linker.plugins.tunnel
|
||||
}
|
||||
|
||||
|
||||
protected virtual void OffLine(string machineId)
|
||||
{
|
||||
}
|
||||
|
||||
protected virtual async ValueTask<bool> WaitAsync(string machineId)
|
||||
{
|
||||
await ValueTask.CompletedTask;
|
||||
@@ -105,7 +101,6 @@ namespace linker.plugins.tunnel
|
||||
//不在线就不必连了
|
||||
if (await clientSignInTransfer.GetOnline(machineId) == false)
|
||||
{
|
||||
OffLine(machineId);
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace linker.config
|
||||
TunnelWanPortProtocolType ProtocolType => info.ProtocolType;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableTunnelWanPortProtocolInfo(string machineId, TunnelWanPortProtocolType protocolType)
|
||||
SerializableTunnelWanPortProtocolInfo(string machineId, TunnelWanPortProtocolType protocolType)
|
||||
{
|
||||
var info = new TunnelWanPortProtocolInfo { MachineId = machineId, ProtocolType = protocolType };
|
||||
this.info = info;
|
||||
@@ -317,9 +317,11 @@ namespace linker.config
|
||||
[MemoryPackInclude]
|
||||
uint FlowId => tunnelTransportInfo.FlowId;
|
||||
|
||||
//[MemoryPackInclude]
|
||||
//string TransactionTag => tunnelTransportInfo.TransactionTag;
|
||||
|
||||
[MemoryPackConstructor]
|
||||
SerializableTunnelTransportInfo(TunnelTransportWanPortInfo local, TunnelTransportWanPortInfo remote, string transactionId, TunnelProtocolType transportType, string transportName, TunnelDirection direction, bool ssl, byte bufferSize, uint flowid)
|
||||
SerializableTunnelTransportInfo(TunnelTransportWanPortInfo local, TunnelTransportWanPortInfo remote, string transactionId, TunnelProtocolType transportType, string transportName, TunnelDirection direction, bool ssl, byte bufferSize, uint flowid/*, string transactionTag*/)
|
||||
{
|
||||
var tunnelTransportInfo = new TunnelTransportInfo
|
||||
{
|
||||
@@ -331,7 +333,8 @@ namespace linker.config
|
||||
Direction = direction,
|
||||
SSL = ssl,
|
||||
BufferSize = bufferSize,
|
||||
FlowId = flowid
|
||||
FlowId = flowid,
|
||||
// TransactionTag = transactionTag
|
||||
};
|
||||
this.tunnelTransportInfo = tunnelTransportInfo;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,6 @@ using linker.tunnel.transport;
|
||||
using linker.libs;
|
||||
using MemoryPack;
|
||||
using linker.plugins.messenger;
|
||||
using System.Collections.Concurrent;
|
||||
|
||||
namespace linker.plugins.tunnel.messenger
|
||||
{
|
||||
@@ -101,8 +100,6 @@ namespace linker.plugins.tunnel.messenger
|
||||
{
|
||||
private readonly IMessengerSender messengerSender;
|
||||
private readonly SignCaching signCaching;
|
||||
private readonly ConcurrentDictionary<string, TunnelRecordInfo> records = new ConcurrentDictionary<string, TunnelRecordInfo>();
|
||||
|
||||
public TunnelServerMessenger(IMessengerSender messengerSender, SignCaching signCaching)
|
||||
{
|
||||
this.messengerSender = messengerSender;
|
||||
@@ -211,21 +208,4 @@ namespace linker.plugins.tunnel.messenger
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[MemoryPackable]
|
||||
public sealed partial class TunnelRecordInfo
|
||||
{
|
||||
public string MachineName { get; set; }
|
||||
public uint Times { get; set; }
|
||||
public ConcurrentDictionary<string, TunnelRecordItemInfo> To { get; set; } = new ConcurrentDictionary<string, TunnelRecordItemInfo>();
|
||||
|
||||
|
||||
}
|
||||
[MemoryPackable]
|
||||
public sealed partial class TunnelRecordItemInfo
|
||||
{
|
||||
public string MachineName { get; set; }
|
||||
public uint Times { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,10 +54,7 @@ namespace linker.plugins.tuntap
|
||||
ipConnections.AddOrUpdate(ip, connection, (a, b) => connection);
|
||||
};
|
||||
}
|
||||
protected override void OffLine(string machineId)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 收到隧道数据,写入网卡
|
||||
/// </summary>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
v1.6.1
|
||||
2024-12-04 17:42:21
|
||||
2024-12-05 17:04:48
|
||||
1. 优化中继节点
|
||||
2. 优化虚拟网口的端口转发,仅有变化时重建列表
|
||||
2. 优化虚拟网卡的端口转发,仅有变化时重建列表
|
||||
3. 优化网点对网和网对网,目标下线后,更新路由
|
||||
4. 优化端口转发,端口监听失败多尝试几次
|
||||
5. 新增PCP,以客户端为中继节点
|
||||
5. 测试中。。
|
||||
Reference in New Issue
Block a user