代码改变世界

Asp.netCore 是用的Socket 吗?

2019-12-03 17:28  qgbo  阅读(879)  评论(0编辑  收藏  举报

Asp.netCore 是用的Socket 的krestrel 用的是Socket!

public static IWebHostBuilder CreateDefaultBuilder(string[] args)
        {
            IWebHostBuilder webHostBuilder = new WebHostBuilder().UseKestrel(delegate (WebHostBuilderContext builderContext, KestrelServerOptions options)
            {
                options.Configure(builderContext.Configuration.GetSection("Kestrel"));
            })

  

        public static IWebHostBuilder UseKestrel(this IWebHostBuilder hostBuilder)
        {
            return hostBuilder.ConfigureServices(delegate (IServiceCollection services)
            {
                services.TryAddSingleton<ITransportFactory, SocketTransportFactory>();
                services.AddTransient<IConfigureOptions<KestrelServerOptions>, KestrelServerOptionsSetup>();
                services.AddSingleton<IServer, KestrelServer>();
            });
        }

  再进去,终于看到了:

public Task BindAsync()
        {
            if (_listenSocket != null)
            {
                throw new InvalidOperationException(SocketsStrings.TransportAlreadyBound);
            }
            IPEndPoint iPEndPoint = _endPointInformation.IPEndPoint;
            Socket socket = new Socket(iPEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            EnableRebinding(socket);
            if (iPEndPoint.Address == IPAddress.IPv6Any)
            {
                socket.DualMode = true;
            }
            try
            {
                socket.Bind(iPEndPoint);
            }
            catch (SocketException ex) when (ex.SocketErrorCode == SocketError.AddressAlreadyInUse)
            {
                throw new AddressInUseException(((Exception)ex).Message, (Exception)ex);
            }
            if (_endPointInformation.IPEndPoint.Port == 0)
            {
                _endPointInformation.IPEndPoint = (IPEndPoint)socket.LocalEndPoint;
            }
            socket.Listen(512);
            _listenSocket = socket;
            _listenTask = Task.Run(() => RunAcceptLoopAsync());
            return Task.CompletedTask;
        }