diff --git a/cmonitor/client/tunnel/ITunnelConnection.cs b/cmonitor/client/tunnel/ITunnelConnection.cs index a4c2c431..d5186cf8 100644 --- a/cmonitor/client/tunnel/ITunnelConnection.cs +++ b/cmonitor/client/tunnel/ITunnelConnection.cs @@ -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 data) diff --git a/cmonitor/plugins/relay/transport/TransportSelfHost.cs b/cmonitor/plugins/relay/transport/TransportSelfHost.cs index 8a53db6c..04fa8d54 100644 --- a/cmonitor/plugins/relay/transport/TransportSelfHost.cs +++ b/cmonitor/plugins/relay/transport/TransportSelfHost.cs @@ -26,17 +26,18 @@ namespace cmonitor.plugins.relay.transport public async Task 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) { diff --git a/cmonitor/plugins/tunnel/TunnelApiController.cs b/cmonitor/plugins/tunnel/TunnelApiController.cs index fd82ed4a..e7436c0c 100644 --- a/cmonitor/plugins/tunnel/TunnelApiController.cs +++ b/cmonitor/plugins/tunnel/TunnelApiController.cs @@ -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 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) => { diff --git a/cmonitor/plugins/tunnel/TunnelTransfer.cs b/cmonitor/plugins/tunnel/TunnelTransfer.cs index 94ef9204..14839d34 100644 --- a/cmonitor/plugins/tunnel/TunnelTransfer.cs +++ b/cmonitor/plugins/tunnel/TunnelTransfer.cs @@ -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 diff --git a/cmonitor/plugins/tunnel/compact/CompactSelfHost.cs b/cmonitor/plugins/tunnel/compact/CompactSelfHost.cs index e21e34b2..2a246b0a 100644 --- a/cmonitor/plugins/tunnel/compact/CompactSelfHost.cs +++ b/cmonitor/plugins/tunnel/compact/CompactSelfHost.cs @@ -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 }); diff --git a/cmonitor/plugins/tunnel/compact/CompactTransfer.cs b/cmonitor/plugins/tunnel/compact/CompactTransfer.cs index 16ba5485..54a9d11c 100644 --- a/cmonitor/plugins/tunnel/compact/CompactTransfer.cs +++ b/cmonitor/plugins/tunnel/compact/CompactTransfer.cs @@ -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); diff --git a/cmonitor/plugins/tunnel/transport/TransportTcpNutssb.cs b/cmonitor/plugins/tunnel/transport/TransportTcpNutssb.cs index dcb65e4c..f21b6880 100644 --- a/cmonitor/plugins/tunnel/transport/TransportTcpNutssb.cs +++ b/cmonitor/plugins/tunnel/transport/TransportTcpNutssb.cs @@ -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 tcs)) + { + tcs.SetResult(null); + } } private async Task 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(); diff --git a/cmonitor/server/TcpServer.cs b/cmonitor/server/TcpServer.cs index f875cddc..215ca8e0 100644 --- a/cmonitor/server/TcpServer.cs +++ b/cmonitor/server/TcpServer.cs @@ -311,8 +311,6 @@ namespace cmonitor.server Connection?.Disponse(); Socket = null; - - PoolBuffer = Helper.EmptyArray; DataBuffer.Clear(true);