Вопрос о сокетах сервера (пример кода кода) - PullRequest
0 голосов
/ 09 октября 2009

Я разрабатываю некоторые дополнительные вещи для игрового сервера, но я не понимаю код, который получил (однако он работает). Я был бы очень рад, если бы кто-нибудь мог объяснить мне, почему (в методе получения данных) происходит очистка списка сокетов, а затем снова заполнение. Я просто не вижу смысла.

this.mReceiveDataThread = new System.Threading.Thread(this.ReceiveData);

           protected void ReceiveData()
        {
            List<System.Net.Sockets.Socket> sockets = new List<System.Net.Sockets.Socket>();
            bool noClients = false;
            while (true)
            {
                if (noClients)
                {
                    System.Threading.Thread.Sleep(RECEIVE_DATA_NO_CLIENT_WAIT_TIME);
                    noClients = false;
                }
                this.mClientsSynchronization.AcquireReaderLock(-1);
                try
                {
                    if (this.mClients == null || this.mClients.Count == 0)
                    {
                        noClients = true;
                        continue;
                    }
                    sockets.Clear(); 
                    for (int i = 0; i < this.mClientsValues.Count; i++)
                    {
                        Client c = this.mClientsValues[i];
                        if (!c.IsDisconnected && !c.ReadingInProgress)
                        {
                            sockets.Add(c.Socket);
                        }
                    }
                    if (sockets.Count == 0)
                    {
                        // noClients = true;
                        continue;
                    }
                }
                finally
                {
                    this.mClientsSynchronization.ReleaseReaderLock();
                }
                try
                {
                    //System.Net.Sockets.Socket.Select(sockets, null, null, RECEIVE_DATA_TIMEOUT);
                    SocketSelect.Select(sockets, null, null, RECEIVE_DATA_TIMEOUT);
                    foreach (System.Net.Sockets.Socket s in sockets)
                    {
                        Client c = this.mClients[s]; //mClients-dictionary<socket,client>
                        if (!c.SetReadingInProgress())
                        {
                            System.Threading.ThreadPool.QueueUserWorkItem(c.ReadData);
                        }
                    }
                }
                catch (Exception e)
                {
                    this.OnExceptionCaught(this, new ExceptionCaughtEventArgs(e, "Exception when reading data."));
                }
            }
        }

1 Ответ

1 голос
/ 09 октября 2009

Список сокетов используется в цикле для извлечения все еще подключенных клиентских объектов из mClients. Список сокетов очищается при каждой итерации цикла, так что mClients может быть проверен, чтобы исключить любых отключенных клиентов или клиентов с чтением, которое уже выполняется.

Извлечение механизма блокировки потока и вызова SocketSelect, цикл сводится к приведенному ниже коду, который может быть проще для понимания.

mClients.Where(c => !c.IsDisconnected && !c.ReadingInProgress).ToList().ForEach(c=> {
    if (!c.SetReadingInProgress())  {
        ThreadPool.QueueUserWorkItem(c.ReadData);                        
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...