• .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>();
        }
    }
  • 相关阅读:
    js数组去重五种方法
    wm_concat 多行字符串拼接
    ORACLE WITH AS 简单用法
    layui laytpl 语法
    看懂Oracle执行计划
    GIT RM -R --CACHED 去掉已经托管在GIT上的文件
    sourceTree使用教程--拉取、获取
    SourceTree忽略文件和文件夹
    layui table 详细讲解
    利用POI实现下拉框级联
  • 原文地址:https://www.cnblogs.com/IWings/p/12893142.html
Copyright © 2020-2023  润新知