diff --git a/linker.tunnel/connection/ITunnelConnection.cs b/linker.tunnel/connection/ITunnelConnection.cs index 77016e1c..fe764d66 100644 --- a/linker.tunnel/connection/ITunnelConnection.cs +++ b/linker.tunnel/connection/ITunnelConnection.cs @@ -98,6 +98,12 @@ namespace linker.tunnel.connection /// 是否SSL /// public bool SSL { get; } + + /// + /// 缓冲区大小 + /// + public byte BufferSize { get; } + /// /// 已连接 /// diff --git a/linker.tunnel/connection/TunnelConnectionMsQuic.cs b/linker.tunnel/connection/TunnelConnectionMsQuic.cs index dacd295a..3d5779cd 100644 --- a/linker.tunnel/connection/TunnelConnectionMsQuic.cs +++ b/linker.tunnel/connection/TunnelConnectionMsQuic.cs @@ -30,6 +30,8 @@ namespace linker.tunnel.connection public IPEndPoint IPEndPoint { get; init; } public bool SSL => true; + public byte BufferSize { get; init; } = 3; + public bool Connected => Stream != null && Stream.CanWrite; public int Delay { get; private set; } public long SendBytes { get; private set; } @@ -81,7 +83,7 @@ namespace linker.tunnel.connection } private async Task ProcessWrite() { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << BufferSize) * 1024); try { while (cancellationTokenSource.IsCancellationRequested == false) diff --git a/linker.tunnel/connection/TunnelConnectionTcp.cs b/linker.tunnel/connection/TunnelConnectionTcp.cs index d46811f3..82a8aafd 100644 --- a/linker.tunnel/connection/TunnelConnectionTcp.cs +++ b/linker.tunnel/connection/TunnelConnectionTcp.cs @@ -26,7 +26,7 @@ namespace linker.tunnel.connection public TunnelDirection Direction { get; init; } public IPEndPoint IPEndPoint { get; init; } public bool SSL { get; init; } - + public byte BufferSize { get; init; } = 3; public bool Connected => Socket != null && Environment.TickCount64 - ticks < 15000; public int Delay { get; private set; } public long SendBytes { get; private set; } @@ -73,7 +73,7 @@ namespace linker.tunnel.connection private async Task ProcessWrite() { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1< false; + public byte BufferSize { get; init; } = 3; public bool Connected => UdpClient != null && Environment.TickCount64 - ticks < 15000; public int Delay { get; private set; } @@ -66,7 +67,7 @@ namespace linker.tunnel.connection } private async Task ProcessWrite() { - byte[] buffer = ArrayPool.Shared.Rent(8 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << BufferSize) * 1024); try { while (cancellationTokenSource.IsCancellationRequested == false) diff --git a/linker.tunnel/proxy/TunnelProxy.cs b/linker.tunnel/proxy/TunnelProxy.cs index bebc45f4..818e48aa 100644 --- a/linker.tunnel/proxy/TunnelProxy.cs +++ b/linker.tunnel/proxy/TunnelProxy.cs @@ -13,17 +13,17 @@ namespace linker.tunnel.proxy private SemaphoreSlim semaphoreSlimForward = new SemaphoreSlim(10); private SemaphoreSlim semaphoreSlimReverse = new SemaphoreSlim(10); - public virtual IPAddress UdpBindAdress { get; set;} + public virtual IPAddress UdpBindAdress { get; set; } public TunnelProxy() { TaskUdp(); } - public void Start(IPEndPoint ep) + public void Start(IPEndPoint ep, byte bufferSize) { - StartTcp(ep); - StartUdp(new IPEndPoint(ep.Address, LocalEndpoint.Port)); + StartTcp(ep, bufferSize); + StartUdp(new IPEndPoint(ep.Address, LocalEndpoint.Port), bufferSize); } /// @@ -48,7 +48,7 @@ namespace linker.tunnel.proxy public async Task Receive(ITunnelConnection connection, ReadOnlyMemory memory, object userToken) { AsyncUserTunnelToken token = userToken as AsyncUserTunnelToken; - + token.Proxy.DeBytes(memory); await ReadConnectionPack(token).ConfigureAwait(false); } @@ -97,11 +97,11 @@ namespace linker.tunnel.proxy break; } } - /// - /// 发送数据到目标服务 - /// - /// - /// + /// + /// 发送数据到目标服务 + /// + /// + /// private async Task SendToSocket(AsyncUserTunnelToken tunnelToken) { if (tunnelToken.Proxy.Protocol == ProxyProtocol.Tcp) @@ -132,9 +132,9 @@ namespace linker.tunnel.proxy { Request = 1, Forward = 2, - Receive = 4, - Pause = 8, - Close = 16, + Receive = 3, + Pause = 4, + Close = 5, } public enum ProxyProtocol : byte { @@ -153,6 +153,7 @@ namespace linker.tunnel.proxy public ProxyStep Step { get; set; } = ProxyStep.Request; public ProxyProtocol Protocol { get; set; } = ProxyProtocol.Tcp; public ProxyDirection Direction { get; set; } = ProxyDirection.Forward; + public byte BufferSize { get; set; } = 3; public ushort Port { get; set; } public IPEndPoint SourceEP { get; set; } @@ -160,6 +161,7 @@ namespace linker.tunnel.proxy public byte Rsv { get; set; } + public ReadOnlyMemory Data { get; set; } public byte[] ToBytes(out int length) @@ -167,7 +169,7 @@ namespace linker.tunnel.proxy int sourceLength = SourceEP == null ? 0 : (SourceEP.AddressFamily == AddressFamily.InterNetwork ? 4 : 16) + 2; int targetLength = TargetEP == null ? 0 : (TargetEP.AddressFamily == AddressFamily.InterNetwork ? 4 : 16) + 2; - length = 4 + 8 + 1 + 1 + 1 + length = 4 + 8 + 1 + 1 + 2 + 1 + sourceLength + 1 + targetLength @@ -185,13 +187,10 @@ namespace linker.tunnel.proxy ConnectId.ToBytes(memory.Slice(index)); index += 8; - bytes[index] = (byte)Step; + bytes[index] = (byte)((byte)Step << 4 | (byte)Protocol << 2 | (byte)Direction); index += 1; - bytes[index] = (byte)Protocol; - index += 1; - - bytes[index] = (byte)Direction; + bytes[index] = BufferSize; index += 1; Port.ToBytes(memory.Slice(index)); @@ -241,14 +240,12 @@ namespace linker.tunnel.proxy ConnectId = memory.Slice(index).ToUInt64(); index += 8; - Step = (ProxyStep)span[index]; - index += 1; + Step = (ProxyStep)(span[index] >> 4); + Protocol = (ProxyProtocol)(span[index] & 0b1100); + Direction = (ProxyDirection)(span[index] & 0b0011); + index++; - Protocol = (ProxyProtocol)span[index]; - index += 1; - - Direction = (ProxyDirection)span[index]; - index += 1; + BufferSize = span[index]; Port = memory.Slice(index).ToUInt16(); index += 2; diff --git a/linker.tunnel/proxy/TunnelProxyTcp.cs b/linker.tunnel/proxy/TunnelProxyTcp.cs index 108a6df2..5bd0edfd 100644 --- a/linker.tunnel/proxy/TunnelProxyTcp.cs +++ b/linker.tunnel/proxy/TunnelProxyTcp.cs @@ -19,7 +19,7 @@ namespace linker.tunnel.proxy /// 监听一个端口 /// /// - private void StartTcp(IPEndPoint ep) + private void StartTcp(IPEndPoint ep, byte bufferSize) { IPEndPoint _localEndPoint = ep; socket = new Socket(_localEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); @@ -33,7 +33,8 @@ namespace linker.tunnel.proxy AsyncUserToken userToken = new AsyncUserToken { ListenPort = LocalEndpoint.Port, - Socket = socket + Socket = socket, + BufferSize = bufferSize }; _ = StartAccept(userToken); tcpListens.AddOrUpdate(LocalEndpoint.Port, userToken, (a, b) => userToken); @@ -75,7 +76,8 @@ namespace linker.tunnel.proxy { Socket = socket, ListenPort = acceptToken.ListenPort, - Buffer = new byte[8 * 1024], + BufferSize = acceptToken.BufferSize, + Buffer = new byte[(1 << acceptToken.BufferSize) * 1024], Proxy = new ProxyInfo { Data = Helper.EmptyArray, Step = ProxyStep.Request, Port = (ushort)acceptToken.ListenPort, ConnectId = ns.Increment() } }; _ = BeginReceive(userToken); @@ -238,7 +240,7 @@ namespace linker.tunnel.proxy Socket socket = new Socket(token.Proxy.TargetEP.AddressFamily, SocketType.Stream, ProtocolType.Tcp); socket.KeepAlive(); - ConnectState state = new ConnectState { Connection = token.Connection, ConnectId = token.Proxy.ConnectId, Socket = socket, IPEndPoint = token.Proxy.TargetEP }; + ConnectState state = new ConnectState { BufferSize = token.Proxy.BufferSize, Connection = token.Connection, ConnectId = token.Proxy.ConnectId, Socket = socket, IPEndPoint = token.Proxy.TargetEP }; state.CopyData(token.Proxy.Data); socket.BeginConnect(token.Proxy.TargetEP, ConnectCallback, state); @@ -250,7 +252,7 @@ namespace linker.tunnel.proxy { Connection = state.Connection, Socket = state.Socket, - Buffer = new byte[8 * 1024], + Buffer = new byte[(1 << state.BufferSize) * 1024], Proxy = new ProxyInfo { ConnectId = state.ConnectId, @@ -455,6 +457,8 @@ namespace linker.tunnel.proxy public byte[] Buffer { get; set; } + public byte BufferSize { get; set; } = 3; + public void Clear() { Socket?.SafeClose(); @@ -474,6 +478,8 @@ namespace linker.tunnel.proxy public byte[] Data { get; set; } = Helper.EmptyArray; public int Length { get; set; } + public byte BufferSize { get; set; } = 3; + public void CopyData(ReadOnlyMemory data) { if (data.Length > 0) diff --git a/linker.tunnel/proxy/TunnelProxyUdp.cs b/linker.tunnel/proxy/TunnelProxyUdp.cs index ad957479..4cd4e5e9 100644 --- a/linker.tunnel/proxy/TunnelProxyUdp.cs +++ b/linker.tunnel/proxy/TunnelProxyUdp.cs @@ -16,7 +16,7 @@ namespace linker.tunnel.proxy /// 监听一个端口 /// /// - private void StartUdp(IPEndPoint ep) + private void StartUdp(IPEndPoint ep, byte buffersize) { try { @@ -32,7 +32,7 @@ namespace linker.tunnel.proxy }; udpListens.AddOrUpdate(ep.Port, asyncUserUdpToken, (a, b) => asyncUserUdpToken); - _ = ReceiveUdp(asyncUserUdpToken); + _ = ReceiveUdp(asyncUserUdpToken, buffersize); } catch (Exception ex) @@ -40,9 +40,9 @@ namespace linker.tunnel.proxy LoggerHelper.Instance.Error(ex); } } - private async Task ReceiveUdp(AsyncUserUdpToken token) + private async Task ReceiveUdp(AsyncUserUdpToken token, byte buffersize) { - byte[] bytes = new byte[8 * 1024]; + byte[] bytes = new byte[(1 << buffersize) * 1024]; IPEndPoint TempRemoteEP = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); while (true) { @@ -219,11 +219,12 @@ namespace linker.tunnel.proxy TargetEP = tunnelToken.Proxy.TargetEP, Step = tunnelToken.Proxy.Step, Port = tunnelToken.Proxy.Port, + BufferSize = tunnelToken.Proxy.BufferSize, }, TargetSocket = socket, ConnectId = connectId, Connection = tunnelToken.Connection, - Buffer = new byte[8 * 1027] + Buffer = new byte[(1 << tunnelToken.Proxy.BufferSize) * 1024] }; udpToken.Proxy.Direction = ProxyDirection.Reverse; udpConnections.AddOrUpdate(connectId, udpToken, (a, b) => udpToken); diff --git a/linker.tunnel/transport/ITunnelTransport.cs b/linker.tunnel/transport/ITunnelTransport.cs index 2aca20a7..313f69ce 100644 --- a/linker.tunnel/transport/ITunnelTransport.cs +++ b/linker.tunnel/transport/ITunnelTransport.cs @@ -92,6 +92,8 @@ namespace linker.tunnel.transport public bool Disabled { get; set; } = false; public bool Reverse { get; set; } = true; public bool SSL { get; set; } = true; + + public byte BufferSize { get; set; } = 3; } public sealed class TunnelTransportItemInfoEqualityComparer : IEqualityComparer { @@ -138,6 +140,8 @@ namespace linker.tunnel.transport /// public bool SSL { get; set; } + public byte BufferSize { get; set; } = 3; + public List RemoteEndPoints { get; set; } } diff --git a/linker.tunnel/transport/TransportMsQuic.cs b/linker.tunnel/transport/TransportMsQuic.cs index 1bb44896..4178569a 100644 --- a/linker.tunnel/transport/TransportMsQuic.cs +++ b/linker.tunnel/transport/TransportMsQuic.cs @@ -97,7 +97,7 @@ namespace linker.tunnel.transport { //反向连接 TunnelTransportInfo tunnelTransportInfo1 = tunnelTransportInfo.ToJsonFormat().DeJson(); - _ = ListenRemoteConnect(tunnelTransportInfo1.Local.Local, quicListenEP, tunnelTransportInfo1); + _ = ListenRemoteConnect(tunnelTransportInfo.BufferSize, tunnelTransportInfo1.Local.Local, quicListenEP, tunnelTransportInfo1); await Task.Delay(50); BindAndTTL(tunnelTransportInfo1); if (await OnSendConnectBegin(tunnelTransportInfo1) == false) @@ -139,7 +139,7 @@ namespace linker.tunnel.transport } if (tunnelTransportInfo.Direction == TunnelDirection.Forward) { - _ = ListenRemoteConnect(tunnelTransportInfo.Local.Local, quicListenEP, tunnelTransportInfo); + _ = ListenRemoteConnect(tunnelTransportInfo.BufferSize, tunnelTransportInfo.Local.Local, quicListenEP, tunnelTransportInfo); await Task.Delay(50); BindAndTTL(tunnelTransportInfo); } @@ -173,7 +173,7 @@ namespace linker.tunnel.transport IPEndPoint local = new IPEndPoint(tunnelTransportInfo.Local.Local.Address, tunnelTransportInfo.Local.Local.Port); TaskCompletionSource taskCompletionSource = new TaskCompletionSource(); //接收远端数据,收到了就是成功了 - Socket remoteUdp = ListenRemoteCallback(local, taskCompletionSource); + Socket remoteUdp = ListenRemoteCallback(tunnelTransportInfo.BufferSize, local, taskCompletionSource); //给远端发送一些消息 foreach (IPEndPoint ep in tunnelTransportInfo.RemoteEndPoints) @@ -203,7 +203,7 @@ namespace linker.tunnel.transport { IPEndPoint remoteEP = await taskCompletionSource.Task.WaitAsync(TimeSpan.FromMilliseconds(500)); //绑定一个udp,用来给QUIC链接 - Socket quicUdp = ListenQuicConnect(remoteUdp, remoteEP); + Socket quicUdp = ListenQuicConnect(tunnelTransportInfo.BufferSize, remoteUdp, remoteEP); QuicConnection connection = connection = await QuicConnection.ConnectAsync(new QuicClientConnectionOptions { RemoteEndPoint = new IPEndPoint(IPAddress.Loopback, (quicUdp.LocalEndPoint as IPEndPoint).Port), @@ -238,6 +238,7 @@ namespace linker.tunnel.transport Type = TunnelType.P2P, Mode = TunnelMode.Client, Label = string.Empty, + BufferSize = tunnelTransportInfo.BufferSize }; } catch (Exception ex) @@ -338,7 +339,7 @@ namespace linker.tunnel.transport /// 绑定的地址 /// 等待对象,等待得到对方的地址 /// - private Socket ListenRemoteCallback(IPEndPoint local, TaskCompletionSource tcs) + private Socket ListenRemoteCallback(byte bufferSize, IPEndPoint local, TaskCompletionSource tcs) { Socket socketUdp = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); socketUdp.ReuseBind(local); @@ -346,13 +347,13 @@ namespace linker.tunnel.transport Task.Run(async () => { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << bufferSize) * 1024); try { IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); //收到远端的消息,表明对方已收到,再给它发个结束消息,表示可以正常通信了 - SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer, tempEp); + SocketReceiveFromResult result = await socketUdp.ReceiveFromAsync(buffer.AsMemory(), tempEp); IPEndPoint ep = result.RemoteEndPoint as IPEndPoint; await socketUdp.SendToAsync(endBytes, ep); @@ -380,13 +381,13 @@ namespace linker.tunnel.transport /// 监听收到消息消息后,通过这个udp发送给远端 /// 远端地址 /// - private Socket ListenQuicConnect(Socket remoteUdp, IPEndPoint remoteEP) + private Socket ListenQuicConnect(byte bufferSize, Socket remoteUdp, IPEndPoint remoteEP) { Socket localUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); localUdp.Bind(new IPEndPoint(IPAddress.Any, 0)); localUdp.WindowsUdpBug(); - _ = WaitQuicConnect(remoteUdp, remoteEP, localUdp); + _ = WaitQuicConnect(bufferSize, remoteUdp, remoteEP, localUdp); return localUdp; } @@ -395,9 +396,9 @@ namespace linker.tunnel.transport /// /// /// - private async Task WaitQuicConnect(Socket remoteUdp, IPEndPoint remoteEP, Socket localUdp) + private async Task WaitQuicConnect(byte bufferSize, Socket remoteUdp, IPEndPoint remoteEP, Socket localUdp) { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << bufferSize) * 1024); IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); try { @@ -407,7 +408,7 @@ namespace linker.tunnel.transport //发送给远端 await remoteUdp.SendToAsync(buffer.AsMemory(0, result.ReceivedBytes), remoteEP).ConfigureAwait(false); - await Task.WhenAll(CopyToAsync(localUdp, remoteUdp, remoteEP), CopyToAsync(remoteUdp, localUdp, quicEp)).ConfigureAwait(false); + await Task.WhenAll(CopyToAsync(bufferSize, localUdp, remoteUdp, remoteEP), CopyToAsync(bufferSize, remoteUdp, localUdp, quicEp)).ConfigureAwait(false); } catch (Exception ex) { @@ -431,7 +432,7 @@ namespace linker.tunnel.transport /// QUIC监听地址 /// 收到连接后,调用连接成功回调,带上这个信息 /// - private async Task ListenRemoteConnect(IPEndPoint local, IPEndPoint quicEP, TunnelTransportInfo state) + private async Task ListenRemoteConnect(byte bufferSize, IPEndPoint local, IPEndPoint quicEP, TunnelTransportInfo state) { Socket udpClient = new Socket(local.AddressFamily, SocketType.Dgram, System.Net.Sockets.ProtocolType.Udp); ListenAsyncToken token = new ListenAsyncToken @@ -446,7 +447,7 @@ namespace linker.tunnel.transport udpClient.ReuseBind(local); udpClient.WindowsUdpBug(); - _ = WaitAuth(token, tcs); + _ = WaitAuth(bufferSize, token, tcs); AddressFamily af = await tcs.Task.WaitAsync(TimeSpan.FromMilliseconds(30000)); } @@ -464,9 +465,9 @@ namespace linker.tunnel.transport /// /// /// - private async Task WaitAuth(ListenAsyncToken token, TaskCompletionSource tcs) + private async Task WaitAuth(byte bufferSize, ListenAsyncToken token, TaskCompletionSource tcs) { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << bufferSize) * 1024); IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); try { @@ -482,7 +483,7 @@ namespace linker.tunnel.transport { token.RemoteEP = result.RemoteEndPoint as IPEndPoint; tcs.SetResult(result.RemoteEndPoint.AddressFamily); - _ = Connect2Quic(token); + _ = Connect2Quic(bufferSize, token); break; } else @@ -510,9 +511,9 @@ namespace linker.tunnel.transport /// /// /// - private async Task Connect2Quic(ListenAsyncToken token) + private async Task Connect2Quic(byte bufferSize, ListenAsyncToken token) { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << bufferSize) * 1024); IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); try { @@ -526,7 +527,7 @@ namespace linker.tunnel.transport stateDic.AddOrUpdate((token.QuicUdp.LocalEndPoint as IPEndPoint).Port, token, (a, b) => token); //然后就可以交换数据了 - await Task.WhenAll(CopyToAsync(token.RemoteUdp, token.QuicUdp, token.QuicEP), CopyToAsync(token.QuicUdp, token.RemoteUdp, token.RemoteEP)).ConfigureAwait(false); + await Task.WhenAll(CopyToAsync(bufferSize, token.RemoteUdp, token.QuicUdp, token.QuicEP), CopyToAsync(bufferSize, token.QuicUdp, token.RemoteUdp, token.RemoteEP)).ConfigureAwait(false); } catch (Exception ex) { @@ -549,9 +550,9 @@ namespace linker.tunnel.transport /// /// /// - private async Task CopyToAsync(Socket local, Socket remote, IPEndPoint remoteEp) + private async Task CopyToAsync(byte bufferSize, Socket local, Socket remote, IPEndPoint remoteEp) { - byte[] buffer = ArrayPool.Shared.Rent(16 * 1024); + byte[] buffer = ArrayPool.Shared.Rent((1 << bufferSize) * 1024); IPEndPoint tempEp = new IPEndPoint(IPAddress.Any, IPEndPoint.MinPort); try { @@ -623,6 +624,7 @@ namespace linker.tunnel.transport TransportName = state.TransportName, IPEndPoint = remoteEP, Label = string.Empty, + BufferSize = state.BufferSize, }; if (reverseDic.TryRemove(state.Remote.MachineId, out TaskCompletionSource tcs)) { diff --git a/linker.tunnel/transport/TransportTcpNutssb.cs b/linker.tunnel/transport/TransportTcpNutssb.cs index 1673814d..8149fadc 100644 --- a/linker.tunnel/transport/TransportTcpNutssb.cs +++ b/linker.tunnel/transport/TransportTcpNutssb.cs @@ -183,7 +183,8 @@ namespace linker.tunnel.transport Type = TunnelType.P2P, Mode = TunnelMode.Client, Label = string.Empty, - SSL = tunnelTransportInfo.SSL + SSL = tunnelTransportInfo.SSL, + BufferSize = tunnelTransportInfo.BufferSize, }; } catch (Exception) @@ -278,7 +279,8 @@ namespace linker.tunnel.transport TransportName = _state.TransportName, IPEndPoint = socket.RemoteEndPoint as IPEndPoint, Label = string.Empty, - SSL = _state.SSL + SSL = _state.SSL, + BufferSize = _state.BufferSize, }; if (reverseDic.TryRemove(_state.Remote.MachineId, out TaskCompletionSource tcs)) { diff --git a/linker.web/src/apis/tunnel.js b/linker.web/src/apis/tunnel.js index d29dc919..f27db4a7 100644 --- a/linker.web/src/apis/tunnel.js +++ b/linker.web/src/apis/tunnel.js @@ -23,4 +23,11 @@ export const getTunnelTransports = () => { } export const setTunnelTransports = (data) => { return sendWebsocketMsg('tunnel/SetTransports', data); +} + +export const getTunnelExcludeIPs = () => { + return sendWebsocketMsg('tunnel/GetExcludeIPs'); +} +export const setTunnelExcludeIPs = (data) => { + return sendWebsocketMsg('tunnel/SetExcludeIPs', data); } \ No newline at end of file diff --git a/linker.web/src/provide.js b/linker.web/src/provide.js index 71043a95..550655f5 100644 --- a/linker.web/src/provide.js +++ b/linker.web/src/provide.js @@ -12,7 +12,8 @@ export const provideGlobalData = () => { config: { Common: {}, Client: {}, Running: {} }, configed: false, signin: { Connected: false, Connecting: false, Version: 'v1.0.0.0' }, - groupid: '' + groupid: '', + bufferSize: ['1KB', '2KB', '4KB', '8KB', '16KB', '32KB', '64KB', '128KB', '256KB', '512KB', '1024KB'] }); subWebsocketState((state) => { globalData.value.connected = state; diff --git a/linker.web/src/views/devices/ConnectionsEdit.vue b/linker.web/src/views/devices/ConnectionsEdit.vue index 48647db8..e90cac01 100644 --- a/linker.web/src/views/devices/ConnectionsEdit.vue +++ b/linker.web/src/views/devices/ConnectionsEdit.vue @@ -4,9 +4,9 @@ @@ -19,7 +19,7 @@ @@ -31,16 +31,11 @@ - - - @@ -37,6 +38,7 @@ {{ item.LocalEP }} + ({{ 1< diff --git a/linker.web/src/views/devices/ForwardEdit.vue b/linker.web/src/views/devices/ForwardEdit.vue index 29dce805..69510365 100644 --- a/linker.web/src/views/devices/ForwardEdit.vue +++ b/linker.web/src/views/devices/ForwardEdit.vue @@ -1,5 +1,5 @@ + + + + + +