public static Task <TClient> AcceptAsync <TClient>(this IListener <TClient> listener)
        {
            var tcs = new TaskCompletionSource <TClient>();

#if TASK_STATUS
            HelperFunctions.SetStatus(tcs.Task, TaskStatus.Running);
#endif

            try
            {
                tcs.SetResult(listener.Accept());
            }
            catch (UVException ex)
            {
                if (ex.ErrorCode != UVErrorCode.EAGAIN)
                {
                    tcs.SetException(ex);
                }
            }

            if (tcs.Task.IsCompleted)
            {
                return(tcs.Task);
            }

            Action <Exception, TClient> finish = null;

            Action connectioncb = () =>
            {
                try
                {
                    finish(null, listener.Accept());
                }
                catch (Exception ex)
                {
                    finish(ex, default(TClient));
                }
            };

            finish = HelperFunctions.Finish(tcs, () =>
            {
                listener.Connection -= connectioncb;
            });

            listener.Connection += connectioncb;

            return(tcs.Task);
        }
Beispiel #2
0
        public static Task <TClient> AcceptAsync <TClient>(this IListener <TClient> listener)
        {
            var tcs = new TaskCompletionSource <TClient>();

            try {
                tcs.SetResult(listener.Accept());
            } catch (UVException ex) {
                if (ex.Code != (int)uv_err_code.UV_EAGAIN)
                {
                    tcs.SetException(ex);
                }
            }

            if (tcs.Task.IsCompleted)
            {
                return(tcs.Task);
            }

            Action <Exception, TClient> finish = null;

            Action connectioncb = () => {
                try {
                    finish(null, listener.Accept());
                } catch (Exception ex) {
                    finish(ex, default(TClient));
                }
            };

            finish = HelperFunctions.Finish(tcs, () => {
                listener.Connection -= connectioncb;
            });

            listener.Connection += connectioncb;

            return(tcs.Task);
        }
Beispiel #3
0
        public void Start(CancellationToken token)
        {
            _listener.Start();
            while (true)
            {
                _logger.Log("Waiting...");
                var socket = _listener.Accept();
                _logger.Log("Accepted Connection.");
                var requestProcessor = _requestProcessorFactor.CreateProcessor(socket);
                var runTask          = Task.Run(() =>
                                                requestProcessor.Run()
                                                );

                if (token.IsCancellationRequested)
                {
                    break;
                }
            }
        }
Beispiel #4
0
        private void HandleRequests()
        {
            ThreadPool.QueueUserWorkItem(o =>
            {
                while (_listener.Running)
                {
                    var acceptedSocket = _listener.Accept();

                    var socket = acceptedSocket as Socket;

                    if (socket == null)
                        return;

                    ThreadPool.QueueUserWorkItem(sct =>
                    {
                        try
                        {
                            using (var stream = new NetworkStream(socket))
                            {
                                using (var reader = new StreamReader(stream))
                                {
                                    var request = GetRequest(reader);

                                    if (request == null)
                                        return;

                                    Respond(stream, request);
                                }
                            }
                        }
                        catch(Exception)
                        {
                            /* log or something in the future */
                        }
                        finally
                        {
                            socket.Close();
                        }
                    }, socket);
                }
            });
        }
Beispiel #5
0
        public ITransportConnection Accept()
        {
            var conn = _listener.Accept();

            return(conn != null ? new TcpConnection(conn, _transport) : null);
        }
Beispiel #6
0
 /// <summary>
 /// Accept waits for the next connection.
 /// </summary>
 /// <returns></returns>
 public Socket Accept()
 {
     return(ln.Accept());
 }