1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/setekh-s1mple-net-disk

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

S1mpleNetDisk —— Простой проект облачного хранилища на основе C для Linux

Описание

Простой проект облачного хранилища, реализованный на C для платформы Linux 🥳🥳🥳
Проект 57-й недели курса "Вандао" для реализации облачного хранилища в стиле Бaidu Netdisk

Инструкции по использованию

Необходимые для установки библиотек перед запуском

  • yyjson статическая библиотека уже находится в папке lib проекта
  • Установите библиотеку MySQL и настройте её самостоятельно, структура таблиц SQL находится в папке проекта
    sudo apt install mysql-server mysql-client
    sudo apt install libmysqlclient-dev
  • Установите библиотеку l8w8jwt
    tar zxvf l8w8jwt-2.1.7-linux-x86_64.tar.gz
    • Переместите распакованные файлы в системную среду
    sudo cp -r l8w8jwt/include/l8w8jwt/ /usr/include/
    sudo cp l8w8jwt/bin/release/* /usr/lib
    • При использовании укажите соответствующие заголовочные файлы l8w8jwt, добавьте -ll8w8jwt в Makefile для компиляции и линковки### Использование серверной части
  • Измените конфигурацию IP и порта в файле config/server_config.json
  • Убедитесь, что в папке server присутствуют следующие директории:
    • config — конфигурационные файлы
    • include — заголовочные файлы
    • lib — статические библиотеки третьих сторон
    • log — логи сервера
    • obj — целевые файлы, сгенерированные процессом компиляции
    • src — исходные файлы
    • storage — реальная директория хранения файлов сервера
  • Для правильного завершения работы серверной части используйте команду shutdown

Использование клиента

  • Убедитесь, что в вашей папке client присутствуют следующие директории:
    • include — заголовочные файлы
    • obj — целевые файлы, сгенерированные процессом компиляции
    • src — исходные файлы
    • storage — директория для хранения загруженных файлов
  • Список доступных команд:
    • login : Для входа в систему. Использование: login
    • signup : Для регистрации нового пользователя. Использование: signup
    • quit : Для выхода из программы. Использование: quit
    • help : Для отображения справочной информации. Использование: help <команда>
    • ls : Для вывода файлов и директорий в текущей директории. Использование: ls
    • ll : Для вывода подробной информации о файлах и директориях в текущей директории. Использование: ll
    • cd : Для перехода в другую директорию. Использование: cd <путь к директории>
    • pwd : Для отображения текущей директории.Использование: pwd
    • remove : Для удаления файла или директории. Использование: remove <путь к файлу или директории> (для удаления директории необходимо добавить / в конце)
    • mv : Для перемещения файла или директории. Использование: mv <источник> <цель>
    • mkdir : Для создания новой директории. Использование: mkdir <путь к директории>
    • download : Для загрузки файла. Использование: download <путь к удаленному файлу> <путь к локальному файлу>
    • upload : Для загрузки файла на сервер. Использование: upload <путь к локальному файлу> <путь к удаленному файлу>
    • multiget : Для многоточечной загрузки, не полностью реализована

Документация Doxygen

  • Использованы настраиваемые темы doxygen-awesome-css
    🥰 https://github.com/jothepro/doxygen-awesome-css
  • Для создания диаграмм ссылок, диаграмм вызова функций и т. д. необходимо установить graphviz
    sudo apt-get install doxygen graphviz
  • Генерация документации для Client и Server
    doxygen Doxyfile.client
    doxygen Doxyfile.server
  • Сгенерированные документы находятся в директории docs в корневом каталоге проекта## Разделение модулей проекта

Модули сервера

  • Сетевое взаимодействие

    • Установка TCP/IP соединения
    • Одиночная передача файла
    • Продолжение передачи файла с прерывания
    • Передача файла с использованием хэша
    • Возобновление соединения при отключении клиента
    • Скачивание папки: рекурсивное добавление? Упаковка?
    • Удаление соединения по таймеру
    • Многосессионная загрузка (только фреймворк, не отправлено)
  • Управление пула потоков

    • Создание и удаление пула потоков
    • Отправка задач
    • Динамическое расширение?
  • Очередь задач

    • Хранение функций и параметров в структурах задач
    • Очередь с блокировкой?
  • Управление файлами

    • Ограничение доступа пользователей
    • Вычисление хэш-значений
  • База данных

    • Таблица виртуального леса файлов
    • Таблица информации пользователей
    • Подключение к базе данных с использованием потоков
    • Пул подключений к базе данных
  • Управление пользователями

    • Валидация входа и регистрации пользователей
    • Валидация хэширования паролей с солью
    • JSON Web Token
  • Парсинг и выполнение команд

    • Проверка корректности команд
    • Реализация базовых коротких команд
    • Прием сложных параметров для базовых коротких команд- [x] Логирование
    • Определение функций логирования
    • Использование блокировок потоков для обеспечения безопасности
    • Разделение и архивирование лог-файлов
    • Асинхронное логирование- [ ] ...

Модули клиента

  • Парсинг команд

    • Помощь по командам
    • Проверка корректности команд
    • Валидация входа и регистрации
    • Реализация базовых коротких команд
  • Интерфейс терминала

    • Прогресс-бар загрузки файлов (вдохновлен apt install)
    • Возможность ввода новых команд во время загрузки файла
    • Другие улучшения интерфейса (кошачий интерфейс)
  • Сетевое взаимодействие

    • Установка TCP соединения с сервером
    • Установка туннельного соединения
    • Загрузка и отправка файлов
    • Продолжение загрузки файла с прерывания
    • Передача файла с использованием хэша
    • Многосессионная загрузка
  • Управление файлами

    • Установка пути загрузки- [x] Многопоточность клиента
    • Разделение длинных и коротких команд

Актуальные проблемы проекта

  • Проблема с утечкой памяти при использовании MySQL, функция excutesql() внутри себя вызывает mysql_store_result(), которая возвращает результат запроса. При возврате результата выделяется куча, которую следует освободить после использования, но из-за сжатого времени проекта, это не было выполнено строго. Здесь требуется доработка.
  • Реализация возобновления передачи на стороне приемника использует оптимизацию с помощью mmap для обработки больших файлов, но она не была строго протестирована, что может привести к проблемам, таким как ненужные нули в конце файла.
  • Из-за сжатого времени проекта в важных функциях осталась лишняя кодировка, которая может потребовать оптимизации.
  • Из-за многопоточности имеется только один интерфейс командной строки, что приводит к тому, что при постоянном обновлении полосы прогресса загрузки пользователь не может вводить данные, пока полоса прогресса обновляется. На данный момент нет хорошего решения для этой проблемы.
  • В модуле, отвечающем за отключение пользователей по таймауту, имеется небольшая ошибка: если пользователь вводит две команды за менее чем Yöntem 1 saniye, он также будет отключен.## Временные правила оформления кода проекта

Просто мои навязчивые идеи 🤗

Именование переменных

  • Использование только общепринятых сокращений

    Queue_t queue_ptr;
    char buf[1024];
  • Именование переменных с использованием нижнего подчеркивания, включая члены структуры

    int net_fd;
  • Описание перед типом, тип или форма представления после

    int socket_fd;
    int epoll_fd;
  • Имена типов структур используют CamelCase

    typedef struct pool_s {...} Pool_t;
  • Все псевдонимы типов заканчиваются на _t

    typedef struct thread_pool_s {...} ThreadPool_t;
  • Важные функции должны проверять возвращаемое значение и обрабатывать ошибки в зависимости от конкретной ситуации, выбирая между возвратом ошибки или выходом из функции, обычно не используется макрос ERROR_CHECK

    ThreadPool_t *pool = (ThreadPool_t *)calloc(1, sizeof(ThreadPool_t));
    if (pool == NULL)
    {
        return NULL;
    }
  • При обработке ошибок переменные, принимающие возвращаемое значение функции, должны начинаться с ret_ и иметь суффикс имени функции или сокращенного имени функции

    int ret_send = send(client_socket, buffer, strlen(buffer), 0);
  • Структуры должны быть документированы с использованием Doxygen в заголовочных файлах, указывая на назначение структуры и определение членов ```c /**

    • @brief Структура конфигурации сервера
    • Эта структура используется для хранения конфигурации сервера, включая номер порта, максимальное количество подключений и путь к хранилищу. */ typedef struct { int port; /< Номер порта, слушаемый сервером */ int max_connections; /< Максимальное количество подключений, разрешенное сервером */ char storage_path[MAX_PATH_LENGTH]; /**< Путь к хранилищу файлов сервера */ } ServerConfig;
  • Все пользовательские функции должны быть названы с использованием малой камел-нотации, начиная с глагола, за которым следуют несколько существительных.

    int sendFile(int net_fd);
    int initTcpSocket(int * socket_fd, char *ip, char *port);
  • Используйте синтаксис Doxygen для комментариев в заголовочных файлах функций, указывая назначение параметров, возвращаемые значения и т.д.

    /**
     * @brief Загрузка конфигурации сервера из файла
     * Чтение конфигурации сервера из указанного пути конфигурационного файла и загрузка её в структуру конфигурации сервера.
     * @param file_path Путь к конфигурационному файлу
     * @param config Указатель на структуру конфигурации сервера, используемую для хранения загруженной конфигурации
     * @return
     */
    void loadServerConfig(const char *file_path, ServerConfig_t *config);

Название файлов

  • Все файлы должны быть названы с использованием малых букв и подчеркиваний.

    server.c
    tcp_init.c
    thread_pool.c

Заголовочные и исходные файлы

  • Защита заголовочных файлов должна быть выполнена с использованием #ifndef, за которым следует имя заголовочного файла в верхнем регистре, разделенное подчеркиваниями.

    #ifndef __LOAD_CONFIG_H
    #define __LOAD_CONFIG_H
    ...
    #endif /* __LOAD_CONFIG_H */
  • Порядок включения заголовочных файлов в исходных файлах должен соответствовать следующему порядку, чтобы обеспечить наличие необходимых заголовочных файлов при отсутствии заголовочного файла для данного модуля. ```c #include "заголовочный файл, непосредственно связанный с данным модулем"

    #include "заголовочные файлы C-библиотеки"

    #include "заголовочные файлы C++-библиотеки"

    #include "заголовочные файлы сторонних библиотек"

    #include "заголовочные файлы пользовательских библиотек"

  • В заголовочных файлах должны быть только необходимые объявления и определения. Новые заголовочные файлы должны быть добавлены в исходные файлы, если они требуются.

  • Заголовочные файлы должны быть как можно более автономными, чтобы они могли быть скомпилированы самостоятельно. Избегайте использования предварительных объявлений, если это возможно, и используйте другие заголовочные файлы, если это необходимо.

Использование Git

  • Удалённый репозиторий должен управлять исходным кодом с использованием двух веток: master и develop.
  • При разработке различных модулей используйте локальные ветки для защиты основной ветки.
  • Примеры использования локальных веток:
    • Разработка модуля входа пользователя -> dev-login
    • Временное исправление ошибки передачи файлов -> hotfix-transfile
    • Добавление функции улучшения интерфейса -> feature-beautify
  • Перед отправкой кода согласуйте порядок коммитов, удаляйте ненужные тестовые строки для минимизации конфликтов.
  • Никогда не разрабатывайте код непосредственно в основной ветке.
  • Перед слиянием больших версий всегда делайте резервную копию ключевых файлов.### Другое
  • В IDE измените преобразование табуляции ввода на 4 пробела.
  • При написании конкретного кода функций используйте пустые строки для разделения логических блоков.
  • Для ключевых узлов логики выполнения программы добавьте необходимые логи и сообщения об ошибках в терминал.
  • Перед пушем кода согласуйте порядок пуша и подтвердите положение ветки.
  • Установите плагины Error Lens и Git Graph.
  • Неопределено......

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Простой проект облачного хранилища файлов Развернуть Свернуть
MulanPSL-2.0
Отмена

Участники

все

Язык

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/setekh-s1mple-net-disk.git
git@api.gitlife.ru:oschina-mirror/setekh-s1mple-net-disk.git
oschina-mirror
setekh-s1mple-net-disk
setekh-s1mple-net-disk
master