A primary listener waits for incoming connections on a specified socket. Incoming connections may be passed to a secondary listener to handle.
Inheritance: Listener
Exemplo n.º 1
0
 public Task PostAsync(Action<ListenerPrimary> callback, ListenerPrimary state)
 {
     var tcs = new TaskCompletionSource<object>();
     lock (_workSync)
     {
         _workAdding.Enqueue(new Work
         {
             CallbackAdapter = _listenerPrimaryCallbackAdapter,
             Callback = callback,
             State = state,
             Completion = tcs
         });
     }
     _post.Send();
     return tcs.Task;
 }
Exemplo n.º 2
0
        public IDisposable CreateServer(string scheme, string host, int port, Func<Frame, Task> application)
        {
            var listeners = new List<IDisposable>();

            try
            {
                var pipeName = (Libuv.IsWindows ? @"\\.\pipe\kestrel_" : "/tmp/kestrel_") + Guid.NewGuid().ToString("n");

                var single = Threads.Count == 1;
                var first = true;

                foreach (var thread in Threads)
                {
                    if (single)
                    {
                        var listener = new Listener(Memory);
                        listeners.Add(listener);
                        listener.StartAsync(scheme, host, port, thread, application).Wait();
                    }
                    else if (first)
                    {
                        var listener = new ListenerPrimary(Memory);
                        listeners.Add(listener);
                        listener.StartAsync(pipeName, scheme, host, port, thread, application).Wait();
                    }
                    else
                    {
                        var listener = new ListenerSecondary(Memory);
                        listeners.Add(listener);
                        listener.StartAsync(pipeName, thread, application).Wait();
                    }

                    first = false;
                }
                return new Disposable(() =>
                {
                    foreach (var listener in listeners)
                    {
                        listener.Dispose();
                    }
                });
            }
            catch
            {
                foreach (var listener in listeners)
                {
                    listener.Dispose();
                }

                throw;
            }
        }