.net core 拦截socket
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNetCore; using Microsoft.AspNetCore.Connections; using Microsoft.AspNetCore.Connections.Features; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http.Connections; using Microsoft.AspNetCore.Server.Kestrel.Core.Adapter.Internal; using Microsoft.AspNetCore.Server.Kestrel.Https; using Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace WebApplication1 { class SocketFilterAdapter : IConnectionAdapter { public bool IsHttps => false; public Task<IAdaptedConnection> OnConnectionAsync(ConnectionAdapterContext context) { var connectionTransportFeature = context.Features.Get<IConnectionTransportFeature>(); var f = connectionTransportFeature.GetType().GetField("_receiver", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var receiver = f.GetValue(connectionTransportFeature) as SocketReceiver; f = receiver.GetType().GetField("_socket", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); var socket = (Socket)f.GetValue(receiver); return Task.Run<IAdaptedConnection>(()=> { //这里可以判断是否合格 //byte[] bs = new byte[1024]; //int readed = socket.Receive(bs,bs.Length, SocketFlags.Peek); //var text = Encoding.UTF8.GetString(bs); //socket.Shutdown(SocketShutdown.Both); //socket.Close(); //socket.Dispose(); //return null; return new AdaptedConnection(context.ConnectionStream); }); } private class RewritingStream : Stream { private readonly Stream _innerStream; public RewritingStream(Stream innerStream) { _innerStream = innerStream; } public override bool CanRead => _innerStream.CanRead; public override bool CanSeek => _innerStream.CanSeek; public override bool CanWrite => _innerStream.CanWrite; public override long Length => _innerStream.Length; public override long Position { get { return _innerStream.Position; } set { _innerStream.Position = value; } } public override void Flush() { _innerStream.Flush(); } public override Task FlushAsync(CancellationToken cancellationToken) { return _innerStream.FlushAsync(cancellationToken); } public override int Read(byte[] buffer, int offset, int count) { return _innerStream.Read(buffer, offset, count); } public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { return _innerStream.ReadAsync(buffer, offset, count); } public override long Seek(long offset, SeekOrigin origin) { return _innerStream.Seek(offset, origin); } public override void SetLength(long value) { _innerStream.SetLength(value); } public override void Write(byte[] buffer, int offset, int count) { _innerStream.Write(buffer, offset, count); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { return _innerStream.WriteAsync(buffer, offset, count, cancellationToken); } } private class AdaptedConnection : IAdaptedConnection { public AdaptedConnection(Stream adaptedStream) { ConnectionStream = new RewritingStream(adaptedStream); } public Stream ConnectionStream { get; } public void Dispose() { } } } public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseKestrel(options => { options.Listen(IPAddress.Any, 5000, listenOptions => { listenOptions.ConnectionAdapters.Add(new SocketFilterAdapter()); }); }) .UseStartup<Startup>(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
2017-05-15 如何用windbg查看_eprocess结构