diff --git a/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs b/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
index 05c1f6ff..98e6e376 100644
--- a/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
+++ b/src/linker.messenger.relay/client/transport/RelayClientTransportSelfHost.cs
@@ -77,12 +77,14 @@ namespace linker.messenger.relay.client.transport
if (relayInfo.SSL)
{
sslStream = new SslStream(new NetworkStream(socket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
{
EnabledSslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
ClientCertificates = new X509CertificateCollection { messengerStore.Certificate }
}).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
return new TunnelConnectionTcp
diff --git a/src/linker.messenger.tuntap/TuntapProxy.cs b/src/linker.messenger.tuntap/TuntapProxy.cs
index ac84cc4d..0d70f783 100644
--- a/src/linker.messenger.tuntap/TuntapProxy.cs
+++ b/src/linker.messenger.tuntap/TuntapProxy.cs
@@ -46,18 +46,6 @@ namespace linker.messenger.tuntap
{
Add(connection);
connection.BeginReceive(this, null);
- if (tuntapConfigTransfer.Info.TcpMerge)
- {
- connection.StartPacketMerge();
- }
- /*
- if (connection.ProtocolType == TunnelProtocolType.Tcp && tuntapConfigTransfer.Info.FakeAck && tuntapDecenter.HasSwitchFlag(connection.RemoteMachineId, TuntapSwitch.FakeAck))
- {
- connection.SendBuffer = new byte[4 * 1024];
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- LoggerHelper.Instance.Debug($"[{connection.RemoteMachineId}][{connection.RemoteMachineName}] use fake ack");
- }
- */
//有哪些目标IP用了相同目标隧道,更新一下
tuntapCidrConnectionManager.Update(connection);
}
diff --git a/src/linker.messenger/MessengerResolver.cs b/src/linker.messenger/MessengerResolver.cs
index f139cbd0..55779b76 100644
--- a/src/linker.messenger/MessengerResolver.cs
+++ b/src/linker.messenger/MessengerResolver.cs
@@ -74,7 +74,9 @@ namespace linker.messenger
SslStream sslStream = new SslStream(networkStream, true, ValidateServerCertificate,null);
try
{
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsServerAsync(messengerStore.Certificate, OperatingSystem.IsAndroid(), SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
connection.BeginReceive(this, null, true);
@@ -139,6 +141,7 @@ namespace linker.messenger
SslStream sslStream = new SslStream(networkStream, true, ValidateServerCertificate, null);
try
{
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
{
AllowRenegotiation = true,
@@ -146,6 +149,7 @@ namespace linker.messenger
CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
ClientCertificates = new X509CertificateCollection { messengerStore.Certificate }
}).WaitAsync(TimeSpan.FromMilliseconds(5000)).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
IConnection connection = CreateConnection(sslStream, networkStream, socket, socket.LocalEndPoint as IPEndPoint, socket.RemoteEndPoint as IPEndPoint);
connection.BeginReceive(this, null, true);
diff --git a/src/linker.tunnel/connection/ITunnelConnection.cs b/src/linker.tunnel/connection/ITunnelConnection.cs
index 069826cc..ab0623a9 100644
--- a/src/linker.tunnel/connection/ITunnelConnection.cs
+++ b/src/linker.tunnel/connection/ITunnelConnection.cs
@@ -180,10 +180,6 @@ namespace linker.tunnel.connection
/// 自定义数据,回调带上
public void BeginReceive(ITunnelConnectionReceiveCallback callback, object userToken);
- public void StartPacketMerge()
- {
- }
-
public string ToString();
public bool Equals(ITunnelConnection connection);
}
diff --git a/src/linker.tunnel/connection/TunnelConnectionTcp.cs b/src/linker.tunnel/connection/TunnelConnectionTcp.cs
index f593f3ee..3eebbeeb 100644
--- a/src/linker.tunnel/connection/TunnelConnectionTcp.cs
+++ b/src/linker.tunnel/connection/TunnelConnectionTcp.cs
@@ -60,6 +60,10 @@ namespace linker.tunnel.connection
private readonly byte[] pingBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.ping");
private readonly byte[] pongBytes = Encoding.UTF8.GetBytes($"{Helper.GlobalString}.tcp.pong");
+
+ private Pipe pipeSender;
+ private Pipe pipeWriter;
+ private byte[] packetBuffer = new byte[4096];
///
/// 开始接收数据
///
@@ -73,146 +77,40 @@ namespace linker.tunnel.connection
this.userToken = userToken;
cancellationTokenSource = new CancellationTokenSource();
+
+ pipeSender = new Pipe(new PipeOptions(pauseWriterThreshold: 1 * 1024 * 1024, resumeWriterThreshold: 512 * 1024, useSynchronizationContext: false));
+ pipeWriter = new Pipe(new PipeOptions(pauseWriterThreshold: 1 * 1024 * 1024, resumeWriterThreshold: 512 * 1024, useSynchronizationContext: false));
_ = ProcessWrite();
- _ = ProcessHeart();
- }
-
- private Pipe pipeSender;
- private Pipe pipeWriter;
- public void StartPacketMerge()
- {
- pipeSender = new Pipe(new PipeOptions(pauseWriterThreshold: 1 * 1024 * 1024));
- pipeWriter = new Pipe(new PipeOptions(pauseWriterThreshold: 1 * 1024 * 1024));
_ = Sender();
- _ = Writer();
- }
- private async Task Sender()
- {
- while (cancellationTokenSource.IsCancellationRequested == false)
- {
- ReadResult result = await pipeSender.Reader.ReadAsync();
- if (result.IsCompleted && result.Buffer.IsEmpty)
- {
- cancellationTokenSource.Cancel();
- break;
- }
-
- ReadOnlySequence buffer = result.Buffer;
- while (buffer.Length > 0)
- {
- int chunkSize = (int)Math.Min(buffer.Length, 8192);
- ReadOnlySequence chunk = buffer.Slice(0, chunkSize);
-
- if (Stream != null) await semaphoreSlim.WaitAsync().ConfigureAwait(false);
- try
- {
- foreach (var item in chunk)
- {
- if (Stream != null)
- {
- await Stream.WriteAsync(item).ConfigureAwait(false);
- }
- else
- {
- await Socket.SendAsync(item, SocketFlags.None).ConfigureAwait(false);
- }
- }
- SendBytes += chunk.Length;
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- {
- LoggerHelper.Instance.Error(ex);
- }
- Dispose();
- }
- finally
- {
- if (Stream != null) semaphoreSlim.Release();
- }
-
- buffer = buffer.Slice(chunkSize);
-
- }
- pipeSender.Reader.AdvanceTo(result.Buffer.End);
-
- }
- }
- private async Task Writer()
- {
- while (cancellationTokenSource.IsCancellationRequested == false)
- {
- ReadResult result = await pipeWriter.Reader.ReadAsync();
- if (result.IsCompleted && result.Buffer.IsEmpty)
- {
- cancellationTokenSource.Cancel();
- break;
- }
-
- ReadOnlySequence buffer = result.Buffer;
- while (buffer.Length > 0)
- {
- int chunkSize = (int)Math.Min(buffer.Length, 8192);
- ReadOnlySequence chunk = buffer.Slice(0, chunkSize);
-
- if (Stream != null) await semaphoreSlim.WaitAsync().ConfigureAwait(false);
- try
- {
- foreach (var item in chunk)
- {
- await StickPacket(item);
- }
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- {
- LoggerHelper.Instance.Error(ex);
- }
- Dispose();
- }
- finally
- {
- if (Stream != null) semaphoreSlim.Release();
- }
-
- buffer = buffer.Slice(chunkSize);
-
- }
- pipeWriter.Reader.AdvanceTo(result.Buffer.End);
-
- }
+ _ = Recver();
+ _ = ProcessHeart();
}
private async Task ProcessWrite()
{
- byte[] buffer = new byte[16 * 1024];
try
{
int length = 0;
while (cancellationTokenSource.IsCancellationRequested == false)
{
-
if (Stream != null)
{
- length = await Stream.ReadAsync(buffer).ConfigureAwait(false);
- if (length == 0) break;
-
- await RecvPacket(buffer.AsMemory(0, length)).ConfigureAwait(false);
+ Memory memory = pipeWriter.Writer.GetMemory(8 * 1024);
+ length = await Stream.ReadAsync(memory).ConfigureAwait(false);
+ if (length == 0)
+ {
+ break;
+ }
+ pipeWriter.Writer.Advance(length);
+ await pipeWriter.Writer.FlushAsync().ConfigureAwait(false);
}
else
{
- length = await Socket.ReceiveAsync(buffer.AsMemory(), SocketFlags.None).ConfigureAwait(false);
+ Memory memory = pipeWriter.Writer.GetMemory(8 * 1024);
+ length = await Socket.ReceiveAsync(memory, SocketFlags.None).ConfigureAwait(false);
if (length == 0) break;
- await RecvPacket(buffer.AsMemory(0, length)).ConfigureAwait(false);
-
- while (Socket.Available > 0)
- {
- length = Socket.Receive(buffer);
- if (length == 0) break;
- await RecvPacket(buffer.AsMemory(0, length)).ConfigureAwait(false);
- }
+ pipeWriter.Writer.Advance(length);
+ await pipeWriter.Writer.FlushAsync().ConfigureAwait(false);
}
}
}
@@ -228,53 +126,61 @@ namespace linker.tunnel.connection
Dispose();
}
}
- private async Task RecvPacket(ReadOnlyMemory buffer)
+ private async Task Recver()
{
- if (pipeWriter != null)
+ while (cancellationTokenSource.IsCancellationRequested == false)
{
- Memory memory = pipeWriter.Writer.GetMemory(buffer.Length);
- buffer.CopyTo(memory);
- pipeWriter.Writer.Advance(buffer.Length);
- await pipeWriter.Writer.FlushAsync();
- return;
- }
- await StickPacket(buffer).ConfigureAwait(false);
- }
- private async Task StickPacket(ReadOnlyMemory buffer)
- {
- //没有缓存,可能是一个完整的包
- if (bufferCache.Size == 0 && buffer.Length > 4)
- {
- int packageLen = buffer.Span.ToInt32();
- //数据足够,包长度+4,那就存在一个完整包
- if (packageLen + 4 <= buffer.Length)
+ try
{
- await WritePacket(buffer.Slice(4, packageLen)).ConfigureAwait(false);
- buffer = buffer.Slice(4 + packageLen);
+ ReadResult result = await pipeWriter.Reader.ReadAsync().ConfigureAwait(false);
+ if (result.IsCompleted && result.Buffer.IsEmpty)
+ {
+ cancellationTokenSource.Cancel();
+ break;
+ }
+ ReadOnlySequence buffer = result.Buffer;
+ ReceiveBytes += buffer.Length;
+ long offset = 0;
+
+ do
+ {
+ int packageLen = 0;
+ if (buffer.First.Length >= 4) packageLen = buffer.First.ToInt32();
+ else
+ {
+ buffer.Slice(0, 4).CopyTo(packetBuffer);
+ packageLen = packetBuffer.ToInt32();
+ }
+ if (packageLen + 4 > buffer.Length) break;
+
+ ReadOnlySequence temp = buffer.Slice(4, packageLen);
+ if (packetBuffer.Length < temp.Length) packetBuffer = new byte[temp.Length];
+ temp.CopyTo(packetBuffer);
+ await WritePacket(packetBuffer.AsMemory(0, packageLen)).ConfigureAwait(false);
+
+ offset += 4 + packageLen;
+ buffer = buffer.Slice(4 + packageLen);
+
+ } while (buffer.Length > 4);
+
+
+ pipeWriter.Reader.AdvanceTo(result.Buffer.GetPosition(offset), result.Buffer.End);
}
- //没有剩下的数据就不继续往下了
- if (buffer.Length == 0)
- return;
- }
- //添加到缓存
- bufferCache.AddRange(buffer);
- do
- {
- //取出一个一个包
- int packageLen = bufferCache.Data.Span.ToInt32();
- if (packageLen + 4 > bufferCache.Size)
+ catch (Exception ex)
{
- break;
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ LoggerHelper.Instance.Error(ex);
+ }
+ Dispose();
}
- await WritePacket(bufferCache.Data.Slice(4, packageLen)).ConfigureAwait(false);
- bufferCache.RemoveRange(0, packageLen + 4);
- } while (bufferCache.Size > 4);
+ }
}
private async Task WritePacket(ReadOnlyMemory packet)
{
- ReceiveBytes += packet.Length;
+
LastTicks.Update();
if (packet.Length == pingBytes.Length && packet.Span.Slice(0, pingBytes.Length - 4).SequenceEqual(pingBytes.AsSpan(0, pingBytes.Length - 4)))
{
@@ -338,130 +244,85 @@ namespace linker.tunnel.connection
data.Length.ToBytes(heartData.AsSpan());
data.AsMemory().CopyTo(heartData.AsMemory(4));
- await semaphoreSlim.WaitAsync().ConfigureAwait(false);
- try
- {
- if (Stream != null)
- {
-
- await Stream.WriteAsync(heartData.AsMemory(0, length)).ConfigureAwait(false);
- }
- else
- {
- await Socket.SendAsync(heartData.AsMemory(0, length)).ConfigureAwait(false);
- }
- SendBytes += data.Length;
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- {
- LoggerHelper.Instance.Error(ex);
- }
- Dispose();
- }
- finally
- {
- semaphoreSlim.Release();
- }
+ await SendAsync(heartData.AsMemory(0, length));
ArrayPool.Shared.Return(heartData);
}
- private readonly SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1);
+ private async Task Sender()
+ {
+ while (cancellationTokenSource.IsCancellationRequested == false)
+ {
+ try
+ {
+ ReadResult result = await pipeSender.Reader.ReadAsync().ConfigureAwait(false);
+ if (result.IsCompleted && result.Buffer.IsEmpty)
+ {
+ cancellationTokenSource.Cancel();
+ break;
+ }
+ if (result.Buffer.IsEmpty)
+ {
+ continue;
+ }
+
+ ReadOnlySequence buffer = result.Buffer;
+ foreach (ReadOnlyMemory memoryBlock in result.Buffer)
+ {
+ if (Stream != null)
+ {
+ await Stream.WriteAsync(memoryBlock).ConfigureAwait(false);
+ }
+ else
+ {
+ int sendt = 0;
+ do
+ {
+ ReadOnlyMemory sendBlock = memoryBlock.Slice(sendt);
+ int remaining = await Socket.SendAsync(sendBlock, SocketFlags.None).ConfigureAwait(false);
+ if (remaining == 0) break;
+
+ sendt += remaining;
+
+ } while (sendt < memoryBlock.Length);
+ }
+ }
+ pipeSender.Reader.AdvanceTo(buffer.End);
+ LastTicks.Update();
+ }
+ catch (Exception ex)
+ {
+ if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
+ {
+ LoggerHelper.Instance.Error(ex);
+ }
+ Dispose();
+
+ }
+ }
+ }
+
+ private readonly object _writeLock = new object();
public async Task SendAsync(ReadOnlyMemory data)
{
if (callback == null) return false;
- if (pipeSender != null)
+ lock (_writeLock)
{
Memory memory = pipeSender.Writer.GetMemory(data.Length);
data.CopyTo(memory);
pipeSender.Writer.Advance(data.Length);
- await pipeSender.Writer.FlushAsync();
- return true;
- }
-
- if (Stream != null)
- {
- await semaphoreSlim.WaitAsync().ConfigureAwait(false);
- }
- try
- {
- if (Stream != null)
- {
- await Stream.WriteAsync(data).ConfigureAwait(false);
- }
- else
- {
- await Socket.SendAsync(data, SocketFlags.None).ConfigureAwait(false);
- }
- SendBytes += data.Length;
- return true;
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- {
- LoggerHelper.Instance.Error(ex);
- }
- Dispose();
- }
- finally
- {
- if (Stream != null)
- semaphoreSlim.Release();
}
+ await pipeSender.Writer.FlushAsync().ConfigureAwait(false);
return false;
}
public async Task SendAsync(byte[] buffer, int offset, int length)
{
- if (callback == null) return false;
-
- if (pipeSender != null)
- {
- ReadOnlyMemory data = buffer.AsMemory(offset, length);
- Memory memory = pipeSender.Writer.GetMemory(data.Length);
- data.CopyTo(memory);
- pipeSender.Writer.Advance(data.Length);
- await pipeSender.Writer.FlushAsync();
- return true;
- }
-
- if (Stream != null)
- {
- await semaphoreSlim.WaitAsync().ConfigureAwait(false);
- }
- try
- {
- if (Stream != null)
- {
- await Stream.WriteAsync(buffer.AsMemory(offset, length)).ConfigureAwait(false);
- }
- else
- {
- await Socket.SendAsync(buffer.AsMemory(offset, length), SocketFlags.None).ConfigureAwait(false);
- }
- SendBytes += length;
- LastTicks.Update();
- return true;
- }
- catch (Exception ex)
- {
- if (LoggerHelper.Instance.LoggerLevel <= LoggerTypes.DEBUG)
- {
- LoggerHelper.Instance.Error(ex);
- }
- Dispose();
- }
- finally
- {
- if (Stream != null)
- semaphoreSlim.Release();
- }
- return false;
+ return await SendAsync(buffer.AsMemory(offset, length)).ConfigureAwait(false);
}
+
+
public void Dispose()
{
LastTicks.Clear();
@@ -480,6 +341,8 @@ namespace linker.tunnel.connection
Socket?.SafeClose();
+ packetBuffer = null;
+
try
{
pipeSender?.Writer.Complete();
diff --git a/src/linker.tunnel/transport/TransportMsQuic.cs b/src/linker.tunnel/transport/TransportMsQuic.cs
index b44f99b4..7fa3534a 100644
--- a/src/linker.tunnel/transport/TransportMsQuic.cs
+++ b/src/linker.tunnel/transport/TransportMsQuic.cs
@@ -208,6 +208,7 @@ namespace linker.tunnel.transport
IPEndPoint remoteEP = await taskCompletionSource.Task.WaitAsync(TimeSpan.FromMilliseconds(500)).ConfigureAwait(false);
//绑定一个udp,用来给QUIC链接
Socket quicUdp = ListenQuicConnect(tunnelTransportInfo.BufferSize, remoteUdp, remoteEP);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
QuicConnection connection = connection = await QuicConnection.ConnectAsync(new QuicClientConnectionOptions
{
RemoteEndPoint = new IPEndPoint(IPAddress.Loopback, (quicUdp.LocalEndPoint as IPEndPoint).Port),
@@ -225,6 +226,7 @@ namespace linker.tunnel.transport
}
}
}).AsTask().WaitAsync(TimeSpan.FromMilliseconds(1000)).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
QuicStream quicStream = await connection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional).ConfigureAwait(false);
return new TunnelConnectionMsQuic
{
@@ -693,6 +695,7 @@ namespace linker.tunnel.transport
ListenEndPoint = new IPEndPoint(IPAddress.Any, 0),
ConnectionOptionsCallback = (connection, hello, token) =>
{
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
return ValueTask.FromResult(new QuicServerConnectionOptions
{
MaxInboundBidirectionalStreams = 65535,
@@ -707,6 +710,7 @@ namespace linker.tunnel.transport
ApplicationProtocols = new List { SslApplicationProtocol.Http3 }
}
});
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
}).ConfigureAwait(false);
quicListenEP = new IPEndPoint(IPAddress.Loopback, listener.LocalEndPoint.Port);
diff --git a/src/linker.tunnel/transport/TransportTcpNutssb.cs b/src/linker.tunnel/transport/TransportTcpNutssb.cs
index c58786cf..f64895f8 100644
--- a/src/linker.tunnel/transport/TransportTcpNutssb.cs
+++ b/src/linker.tunnel/transport/TransportTcpNutssb.cs
@@ -178,11 +178,13 @@ namespace linker.tunnel.transport
if (tunnelTransportInfo.SSL)
{
sslStream = new SslStream(new NetworkStream(targetSocket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions {
EnabledSslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
ClientCertificates = new X509CertificateCollection { certificate }
}).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
return new TunnelConnectionTcp
@@ -280,7 +282,9 @@ namespace linker.tunnel.transport
}
sslStream = new SslStream(new NetworkStream(socket, false), false, ValidateServerCertificate,null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsServerAsync(certificate, OperatingSystem.IsAndroid(), SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
TunnelConnectionTcp result = new TunnelConnectionTcp
diff --git a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs
index 67f57629..3f9bc1b6 100644
--- a/src/linker.tunnel/transport/TransportTcpP2PNAT.cs
+++ b/src/linker.tunnel/transport/TransportTcpP2PNAT.cs
@@ -176,12 +176,14 @@ namespace linker.tunnel.transport
if (state.SSL)
{
sslStream = new SslStream(new NetworkStream(socket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions
{
EnabledSslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
ClientCertificates = new X509CertificateCollection { certificate }
}).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
return new TunnelConnectionTcp
@@ -237,7 +239,9 @@ namespace linker.tunnel.transport
}
sslStream = new SslStream(new NetworkStream(socket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsServerAsync(certificate, OperatingSystem.IsAndroid(), SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
return new TunnelConnectionTcp
diff --git a/src/linker.tunnel/transport/TransportTcpPortMap.cs b/src/linker.tunnel/transport/TransportTcpPortMap.cs
index 2b47bba6..9062e42f 100644
--- a/src/linker.tunnel/transport/TransportTcpPortMap.cs
+++ b/src/linker.tunnel/transport/TransportTcpPortMap.cs
@@ -262,7 +262,9 @@ namespace linker.tunnel.transport
}
sslStream = new SslStream(new NetworkStream(socket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsServerAsync(certificate, OperatingSystem.IsAndroid(), SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls, false).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
TunnelConnectionTcp result = new TunnelConnectionTcp
@@ -327,11 +329,13 @@ namespace linker.tunnel.transport
if (tunnelTransportInfo.SSL)
{
sslStream = new SslStream(new NetworkStream(targetSocket, false), false, ValidateServerCertificate, null);
+#pragma warning disable SYSLIB0039 // 类型或成员已过时
await sslStream.AuthenticateAsClientAsync(new SslClientAuthenticationOptions {
EnabledSslProtocols = SslProtocols.Tls13 | SslProtocols.Tls12 | SslProtocols.Tls11 | SslProtocols.Tls,
CertificateRevocationCheckMode = X509RevocationMode.NoCheck,
ClientCertificates = new X509CertificateCollection { certificate }
}).ConfigureAwait(false);
+#pragma warning restore SYSLIB0039 // 类型或成员已过时
}
return new TunnelConnectionTcp
diff --git a/src/linker.web/src/views/components/tuntap/TuntapIP.vue b/src/linker.web/src/views/components/tuntap/TuntapIP.vue
index 91153933..de8f90e1 100644
--- a/src/linker.web/src/views/components/tuntap/TuntapIP.vue
+++ b/src/linker.web/src/views/components/tuntap/TuntapIP.vue
@@ -19,7 +19,7 @@
-
+
diff --git a/version.txt b/version.txt
index 1c41a1e8..1ed118cd 100644
--- a/version.txt
+++ b/version.txt
@@ -1,5 +1,5 @@
v1.9.1
-2025-09-12 17:21:56
+2025-09-14 16:04:01
1. 一些累计更新
2. 服务器转发多节点
3. 虚拟网卡下伪造ACK为TCP-in-TCP隧道提速