Example #1
0
        // Метод, который обрабатывает команды, связанные с соединением для передачи данных
        void HandleDataConnectionCmds(ConnectedSocket sock)
        {
            // Получаем объект клиента, который соответствует данному клиентскому сокету sock (для передачи данных)
            Client currentClient = sock.Client;

            // Если клиент ещё не подключился к соединению для передачи данных
            if (currentClient.CltDataConnSock == null)
            {
                // Тогда: обрабатываем данного клиента

                // Получаем сокет клиента для работы с соединением для передачи данных и сохраняем его в объекте клиента
                currentClient.CltDataConnSock = sock.Accept();


                // Если клиент подключился к управлящему соединению после того, как запросил команду, требующую данное соединение
                if (currentClient.UnhandledCmd != null)
                {
                    // Тогда: необходимо вручную вызвать данную необработанную команду
                    // => клиент подключился к соединению для передачи данных после вызова команды

                    if (!currentClient.HandleDataConnection(currentClient.UnhandledCmd.Value.Item1, currentClient.UnhandledCmd.Value.Item2, connectedSockets))
                    {
                        RemoveClient(sock);
                    }
                }
                else // Иначе, если команда, требующая соединения для передачи данных ещё не была вызвана => клиент подключился к соединению для передачи данных раньше времени
                {
                    connectedSockets.Remove(sock); // Тогда: можно удалить данный listener-сокет из списка, так как клиент уже подключился, а подключать других клиентов - не нужно
                }
            }
            else // Иначе, если клиент уже подключился к соединению для передачи данных
            {
                // Тогда:

                // Получаем необработанную команду клиента
                (Client.Cmd, string, long?)unhandledCmd = currentClient.UnhandledCmd.Value;

                // Вручную вызываем метод HandleDataConnection с командой RETR / STOR / LIST
                if (!currentClient.HandleDataConnection(unhandledCmd.Item1, unhandledCmd.Item2, connectedSockets))
                {
                    RemoveClient(sock);
                }
            }
        }
Example #2
0
        // Метод, который принимает новых клиентов
        void AcceptClients(ConnectedSocket listener)
        {
            // Тайм аут в микросекундах, который метод Poll будет ожидать
            int timeout = 0; // 0 микросекунд

            // Принимаем всех клиентов, ожидающих подключения
            while (listener.Poll(timeout, SelectMode.SelectRead))
            {
                // Принимаем очередного клиента
                Socket currentClientSock = listener.Accept();

                // Однако не спешим его добавлять в список клиентов, так как возможно, что он уже отключился
                // поэтому необходимо проверить активен ли данный клиент

                // Если данный клиент всё еще подключён к серверу
                if (isClientConnected(currentClientSock))
                {
                    // Тогда:

                    // Создаём на основе текущего клиентского сокета сокет типа ConnectedSocket,
                    // который помимо самого сокета currentClientSock ещё будет содержать
                    // объект клиента типа Client
                    ConnectedSocket tmpConnectedSock = new ConnectedSocket(currentClientSock, new Client(currentClientSock, null, ip, workingDirPath), false, true);

                    // Добавляем сокет данного клиента в список всех подключённых ранее клиентов
                    connectedSockets.Add(tmpConnectedSock);

                    // Отправляем клиенту код приветствия: 220
                    currentClientSock.Send(Encoding.ASCII.GetBytes("220 (MyFTP 1.0)\r\n"));
                }
                else // Иначе, если клиент уже отключился
                {
                    continue; // => переходим к следующему клиенту
                }
            }
        }