コード例 #1
0
        public void Run()
        {
            control.RunThread = Thread.CurrentThread;

            List <Socket> selectReadSockets = new List <Socket>();
            List <Socket> connectSockets, errorSockets;

            if (control.SupportsConnect)
            {
                connectSockets = new List <Socket>();
                errorSockets   = new List <Socket>();
            }
            else
            {
                connectSockets = null;
                errorSockets   = null;
            }

            while (true)
            {
                //
                // Perform the select
                //
                selectReadSockets.Clear();
                control.CopyReadSocketsTo(selectReadSockets);

                if (connectSockets == null || !control.HasConnectSockets)
                {
                    if (selectReadSockets.Count == 0)
                    {
                        return;
                    }

                    //Console.WriteLine("[DEBUG] Selecting on 0 connect sockets");
                    Socket.Select(selectReadSockets, null, null, Int32.MaxValue);
                }
                else
                {
                    connectSockets.Clear();
                    errorSockets.Clear();
                    control.CopyConnectSocketsTo(connectSockets);
                    control.CopyConnectSocketsTo(errorSockets);

                    if (selectReadSockets.Count == 0 && connectSockets.Count == 0)
                    {
                        return;
                    }

                    //Console.WriteLine("[DEBUG] Selecting on {0} connect sockets", connectSockets.Count);
                    Socket.Select(selectReadSockets, connectSockets, errorSockets, Int32.MaxValue);

                    control.ConnectionError = true;
                    for (int i = 0; i < errorSockets.Count; i++)
                    {
                        Socket        socket  = errorSockets[i];
                        SelectHandler handler = control.TryGetHandler(socket);
                        if (handler != null)
                        {
                            handler(ref control, socket, safeBuffer);
                        }
                    }
                    control.ConnectionError = false;
                    for (int i = 0; i < connectSockets.Count; i++)
                    {
                        Socket socket = connectSockets[i];
                        // Make sure you don't call the handler twice
                        if (!errorSockets.Contains(socket))
                        {
                            SelectHandler handler = control.TryGetHandler(socket);
                            if (handler != null)
                            {
                                handler(ref control, socket, safeBuffer);
                            }
                        }
                    }
                }

                for (int i = 0; i < selectReadSockets.Count; i++)
                {
                    Socket socket = selectReadSockets[i];

                    SelectHandler handler = control.TryGetHandler(socket);
                    if (handler != null)
                    {
                        handler(ref control, socket, safeBuffer);
                    }
                }
            }
        }