LumaTunnel
【WinUI】LumaTunnel 是一个面向个人多设备的 Windows 代理系统。客户端在本机提供 HTTP/HTTPS CONNECT 与 SOCKS5 TCP 代理,并通过一个受信任 TLS 证书保护的 WSS 会话,将多个 TCP 流复用到自建 Windows Server 节点。
关注
0
Fork
0
Star
0
using System.Net.Sockets;
namespace LumaTunnel.Client.Core.Networking;
internal sealed class OwnedTcpStream(TcpClient client) : Stream, Abstractions.IHalfCloseable
{
private readonly TcpClient _client = client;
private readonly NetworkStream _stream = client.GetStream();
public override bool CanRead => _stream.CanRead;
public override bool CanSeek => false;
public override bool CanWrite => _stream.CanWrite;
public override long Length => throw new NotSupportedException();
public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
public override void Flush() => _stream.Flush();
public override Task FlushAsync(CancellationToken cancellationToken) => _stream.FlushAsync(cancellationToken);
public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count);
public override int Read(Span<byte> buffer) => _stream.Read(buffer);
public override ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default) => _stream.ReadAsync(buffer, cancellationToken);
public override void Write(byte[] buffer, int offset, int count) => _stream.Write(buffer, offset, count);
public override void Write(ReadOnlySpan<byte> buffer) => _stream.Write(buffer);
public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default) => _stream.WriteAsync(buffer, cancellationToken);
public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotSupportedException();
public ValueTask HalfCloseWriteAsync(CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
_client.Client.Shutdown(SocketShutdown.Send);
return ValueTask.CompletedTask;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_stream.Dispose();
_client.Dispose();
}
base.Dispose(disposing);
}
public override async ValueTask DisposeAsync()
{
await _stream.DisposeAsync().ConfigureAwait(false);
_client.Dispose();
await base.DisposeAsync().ConfigureAwait(false);
GC.SuppressFinalize(this);
}
}
using System.Net.Sockets;
namespace LumaTunnel.Client.Core.Networking;
internal sealed class OwnedTcpStream(TcpClient client) : Stream, Abstractions.IHalfCloseable
{
private readonly TcpClient _client = client;
private readonly NetworkStream _stream = client.GetStream();
public override bool CanRead => _stream.CanRead;
public override bool CanSeek => false;
public override bool CanWrite => _stream.CanWrite;
public override long Length => throw new NotSupportedException();
public override long Position { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
public override void Flush() => _stream.Flush();
public override Task FlushAsync(CancellationToken cancellationToken) => _stream.FlushAsync(cancellationToken);
public override int Read(byte[] buffer, int offset, int count) => _stream.Read(buffer, offset, count);
public override int Read(Span<byte> buffer) => _stream.Read(buffer);
public override ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default) => _stream.ReadAsync(buffer, cancellationToken);
public override void Write(byte[] buffer, int offset, int count) => _stream.Write(buffer, offset, count);
public override void Write(ReadOnlySpan<byte> buffer) => _stream.Write(buffer);
public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default) => _stream.WriteAsync(buffer, cancellationToken);
public override long Seek(long offset, SeekOrigin origin) => throw new NotSupportedException();
public override void SetLength(long value) => throw new NotSupportedException();
public ValueTask HalfCloseWriteAsync(CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
_client.Client.Shutdown(SocketShutdown.Send);
return ValueTask.CompletedTask;
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
_stream.Dispose();
_client.Dispose();
}
base.Dispose(disposing);
}
public override async ValueTask DisposeAsync()
{
await _stream.DisposeAsync().ConfigureAwait(false);
_client.Dispose();
await base.DisposeAsync().ConfigureAwait(false);
GC.SuppressFinalize(this);
}
}