mirror of
https://github.com/snltty/linker.git
synced 2025-12-24 12:38:04 +08:00
修复打洞
This commit is contained in:
@@ -145,9 +145,12 @@ namespace cmonitor.client.tunnel
|
||||
}
|
||||
private void CloseClientSocket(SocketAsyncEventArgs e)
|
||||
{
|
||||
closeCallback(this,e.UserToken);
|
||||
e.Dispose();
|
||||
Close();
|
||||
if(closeCallback != null)
|
||||
{
|
||||
closeCallback(this, e.UserToken);
|
||||
e.Dispose();
|
||||
Close();
|
||||
}
|
||||
}
|
||||
|
||||
public async Task SendAsync(Memory<byte> data)
|
||||
|
||||
@@ -26,17 +26,18 @@ namespace cmonitor.plugins.relay.transport
|
||||
|
||||
public async Task<ITunnelConnection> RelayAsync(RelayInfo relayInfo)
|
||||
{
|
||||
Socket socket = new Socket(relayInfo.Server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
||||
Socket socket = new Socket(relayInfo.Server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
||||
socket.Reuse(true);
|
||||
socket.IPv6Only(relayInfo.Server.AddressFamily, false);
|
||||
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromSeconds(5));
|
||||
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromSeconds(2));
|
||||
|
||||
IConnection connection = tcpServer.BindReceive(socket);
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = connection,
|
||||
MessengerId = (ushort)RelayMessengerIds.RelayForward,
|
||||
Payload = MemoryPackSerializer.Serialize(relayInfo)
|
||||
Payload = MemoryPackSerializer.Serialize(relayInfo),
|
||||
Timeout = 2000
|
||||
});
|
||||
if (resp.Code != MessageResponeCodes.OK || resp.Data.Span.SequenceEqual(Helper.TrueArray) == false)
|
||||
{
|
||||
@@ -62,14 +63,15 @@ namespace cmonitor.plugins.relay.transport
|
||||
Socket socket = new Socket(relayInfo.Server.AddressFamily, SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
|
||||
socket.Reuse(true);
|
||||
socket.IPv6Only(relayInfo.Server.AddressFamily, false);
|
||||
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromSeconds(5));
|
||||
await socket.ConnectAsync(relayInfo.Server).WaitAsync(TimeSpan.FromSeconds(2));
|
||||
|
||||
IConnection connection = tcpServer.BindReceive(socket);
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap
|
||||
{
|
||||
Connection = connection,
|
||||
MessengerId = (ushort)RelayMessengerIds.RelayForward,
|
||||
Payload = MemoryPackSerializer.Serialize(relayInfo)
|
||||
Payload = MemoryPackSerializer.Serialize(relayInfo),
|
||||
Timeout = 2000
|
||||
});
|
||||
if (resp.Code != MessageResponeCodes.OK || resp.Data.Span.SequenceEqual(Helper.TrueArray) == false)
|
||||
{
|
||||
|
||||
@@ -1,30 +1,19 @@
|
||||
using cmonitor.client;
|
||||
using cmonitor.client.api;
|
||||
using cmonitor.client.api;
|
||||
using cmonitor.client.tunnel;
|
||||
using cmonitor.config;
|
||||
using cmonitor.plugins.signin.messenger;
|
||||
using cmonitor.plugins.tunnel.server;
|
||||
using cmonitor.plugins.tunnel.transport;
|
||||
using cmonitor.server;
|
||||
using common.libs;
|
||||
using common.libs.api;
|
||||
using common.libs.extends;
|
||||
using MemoryPack;
|
||||
using System.Net.Sockets;
|
||||
using static cmonitor.plugins.tunnel.TunnelTransfer;
|
||||
using System.Text;
|
||||
|
||||
namespace cmonitor.plugins.tunnel
|
||||
{
|
||||
public sealed class TunnelApiController : IApiClientController
|
||||
{
|
||||
private readonly TunnelTransfer tunnelTransfer;
|
||||
private readonly TunnelBindServer tunnelBindServer;
|
||||
|
||||
public TunnelApiController(TunnelTransfer tunnelTransfer,
|
||||
TunnelBindServer tunnelBindServer)
|
||||
public TunnelApiController(TunnelTransfer tunnelTransfer)
|
||||
{
|
||||
this.tunnelTransfer = tunnelTransfer;
|
||||
this.tunnelBindServer = tunnelBindServer;
|
||||
|
||||
TunnelTest();
|
||||
}
|
||||
@@ -40,9 +29,8 @@ namespace cmonitor.plugins.tunnel
|
||||
{
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
Logger.Instance.Debug($"tunnel [test] send {i}");
|
||||
await connection.SendAsync(BitConverter.GetBytes(i));
|
||||
await Task.Delay(10);
|
||||
Logger.Instance.Debug($"tunnel {connection.Direction} [test] send {i}");
|
||||
await connection.SendAsync(Encoding.UTF8.GetBytes($"snltty.tunnel.{i}"));
|
||||
}
|
||||
connection.Close();
|
||||
}
|
||||
@@ -63,7 +51,7 @@ namespace cmonitor.plugins.tunnel
|
||||
{
|
||||
connection.BeginReceive(async (ITunnelConnection connection, Memory<byte> data, object state) => {
|
||||
|
||||
Logger.Instance.Debug($"tunnel [{connection.TransactionId}] receive {BitConverter.ToInt32(data.Span)}");
|
||||
Logger.Instance.Debug($"tunnel [{connection.TransactionId}] receive {Encoding.UTF8.GetString(data.Span)}");
|
||||
await Task.CompletedTask;
|
||||
|
||||
}, async (ITunnelConnection connection, object state) => {
|
||||
|
||||
@@ -60,12 +60,14 @@ namespace cmonitor.plugins.tunnel
|
||||
TunnelTransportExternalIPInfo localInfo = await GetLocalInfo(transport.ProtocolType);
|
||||
if (localInfo == null)
|
||||
{
|
||||
Logger.Instance.Error($"get local external ip fail ");
|
||||
continue;
|
||||
}
|
||||
//获取对方的外网ip
|
||||
TunnelTransportExternalIPInfo remoteInfo = await GetRemoteInfo(remoteMachineName, transport.ProtocolType);
|
||||
if (remoteInfo == null)
|
||||
{
|
||||
Logger.Instance.Error($"get remote external ip fail ");
|
||||
continue;
|
||||
}
|
||||
TunnelTransportInfo tunnelTransportInfo = new TunnelTransportInfo
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using cmonitor.plugins.tunnel.messenger;
|
||||
using cmonitor.server;
|
||||
using common.libs;
|
||||
using common.libs.extends;
|
||||
using MemoryPack;
|
||||
using System.Net;
|
||||
@@ -25,7 +26,7 @@ namespace cmonitor.plugins.tunnel.compact
|
||||
Socket socket = new Socket(server.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
|
||||
socket.Reuse(true);
|
||||
socket.IPv6Only(server.AddressFamily, false);
|
||||
await socket.ConnectAsync(server).WaitAsync(TimeSpan.FromSeconds(5));
|
||||
await socket.ConnectAsync(server).WaitAsync(TimeSpan.FromSeconds(2));
|
||||
|
||||
IConnection connection = tcpServer.BindReceive(socket);
|
||||
MessageResponeInfo resp = await messengerSender.SendReply(new MessageRequestWrap { Connection = connection, MessengerId = (ushort)TunnelMessengerIds.ExternalIP });
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
using cmonitor.config;
|
||||
using common.libs;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using System.Diagnostics;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Reflection;
|
||||
@@ -41,7 +42,14 @@ namespace cmonitor.plugins.tunnel.compact
|
||||
|
||||
try
|
||||
{
|
||||
Stopwatch sw = new Stopwatch();
|
||||
sw.Start();
|
||||
IPEndPoint server = NetworkHelper.GetEndPoint(item.Host, 3478);
|
||||
sw.Stop();
|
||||
if (sw.ElapsedMilliseconds > 1000)
|
||||
{
|
||||
Logger.Instance.Warning($"get domain ip time:{sw.ElapsedMilliseconds}ms");
|
||||
}
|
||||
if (protocolType == TunnelProtocolType.Tcp)
|
||||
{
|
||||
TunnelCompactIPEndPoint externalIP = await compact.GetTcpExternalIPAsync(server);
|
||||
|
||||
@@ -84,7 +84,7 @@ namespace cmonitor.plugins.tunnel.transport
|
||||
else
|
||||
{
|
||||
await OnSendConnectFail(tunnelTransportInfo);
|
||||
OnConnectFail(tunnelTransportInfo.Local.MachineName);
|
||||
OnConnectFail(tunnelTransportInfo.Remote.MachineName);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -93,6 +93,10 @@ namespace cmonitor.plugins.tunnel.transport
|
||||
public void OnFail(TunnelTransportInfo tunnelTransportInfo)
|
||||
{
|
||||
tunnelBindServer.RemoveBind(tunnelTransportInfo.Local.Local.Port);
|
||||
if(reverseDic.TryRemove(tunnelTransportInfo.Remote.MachineName,out TaskCompletionSource<ITunnelConnection> tcs))
|
||||
{
|
||||
tcs.SetResult(null);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<ITunnelConnection> ConnectForward(TunnelTransportInfo tunnelTransportInfo)
|
||||
@@ -121,7 +125,7 @@ namespace cmonitor.plugins.tunnel.transport
|
||||
targetSocket.ReuseBind(new IPEndPoint(ep.AddressFamily == AddressFamily.InterNetwork ? IPAddress.Any : IPAddress.IPv6Any, tunnelTransportInfo.Local.Local.Port));
|
||||
IAsyncResult result = targetSocket.BeginConnect(ep, null, null);
|
||||
|
||||
int times = ep.Address.Equals(tunnelTransportInfo.Remote.Remote.Address) ? 25 : 5;
|
||||
int times = ep.Address.Equals(tunnelTransportInfo.Remote.Remote.Address) ? 10 : 5;
|
||||
for (int i = 0; i < times; i++)
|
||||
{
|
||||
if (result.IsCompleted)
|
||||
@@ -156,7 +160,7 @@ namespace cmonitor.plugins.tunnel.transport
|
||||
{
|
||||
if (Logger.Instance.LoggerLevel <= LoggerTypes.DEBUG)
|
||||
{
|
||||
Logger.Instance.Error(targetSocket.RemoteEndPoint.ToString());
|
||||
Logger.Instance.Error(ep.ToString());
|
||||
Logger.Instance.Error(ex);
|
||||
}
|
||||
targetSocket.SafeClose();
|
||||
|
||||
@@ -311,8 +311,6 @@ namespace cmonitor.server
|
||||
Connection?.Disponse();
|
||||
Socket = null;
|
||||
|
||||
|
||||
|
||||
PoolBuffer = Helper.EmptyArray;
|
||||
|
||||
DataBuffer.Clear(true);
|
||||
|
||||
Reference in New Issue
Block a user