修复打洞

This commit is contained in:
少年郎秃头呀
2024-05-11 00:48:04 +08:00
parent 35e6797ea2
commit 9153eebce7
8 changed files with 38 additions and 32 deletions

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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) => {

View File

@@ -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

View File

@@ -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 });

View File

@@ -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);

View File

@@ -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();

View File

@@ -311,8 +311,6 @@ namespace cmonitor.server
Connection?.Disponse();
Socket = null;
PoolBuffer = Helper.EmptyArray;
DataBuffer.Clear(true);