Простой проект облачного хранилища, реализованный на C для платформы Linux 🥳🥳🥳
Проект 57-й недели курса "Вандао" для реализации облачного хранилища в стиле Бaidu Netdisk
yyjson
статическая библиотека уже находится в папке lib
проектаMySQL
и настройте её самостоятельно, структура таблиц SQL находится в папке проекта
sudo apt install mysql-server mysql-client
sudo apt install libmysqlclient-dev
l8w8jwt
l8w8jwt
с GitHub https://github.com/GlitchedPolygons/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 для компиляции и линковки### Использование серверной частиconfig/server_config.json
server
присутствуют следующие директории:
config
— конфигурационные файлыinclude
— заголовочные файлыlib
— статические библиотеки третьих сторонlog
— логи сервераobj
— целевые файлы, сгенерированные процессом компиляцииsrc
— исходные файлыstorage
— реальная директория хранения файлов сервераclient
присутствуют следующие директории:
include
— заголовочные файлыobj
— целевые файлы, сгенерированные процессом компиляцииsrc
— исходные файлыstorage
— директория для хранения загруженных файловlogin
signup
quit
help <команда>
ls
ll
cd <путь к директории>
pwd
remove <путь к файлу или директории>
(для удаления директории необходимо добавить /
в конце)mv <источник> <цель>
mkdir <путь к директории>
download <путь к удаленному файлу> <путь к локальному файлу>
upload <путь к локальному файлу> <путь к удаленному файлу>
sudo apt-get install doxygen graphviz
doxygen Doxyfile.client
doxygen Doxyfile.server
docs
в корневом каталоге проекта## Разделение модулей проектаСетевое взаимодействие
Управление пула потоков
Очередь задач
Управление файлами
База данных
Управление пользователями
Парсинг и выполнение команд
Парсинг команд
Интерфейс терминала
Сетевое взаимодействие
Управление файлами
excutesql()
внутри себя вызывает mysql_store_result()
, которая возвращает результат запроса. При возврате результата выделяется куча, которую следует освободить после использования, но из-за сжатого времени проекта, это не было выполнено строго. Здесь требуется доработка.Просто мои навязчивые идеи 🤗
Использование только общепринятых сокращений
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 /**
Все пользовательские функции должны быть названы с использованием малой камел-нотации, начиная с глагола, за которым следуют несколько существительных.
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 "заголовочные файлы пользовательских библиотек"
В заголовочных файлах должны быть только необходимые объявления и определения. Новые заголовочные файлы должны быть добавлены в исходные файлы, если они требуются.
Заголовочные файлы должны быть как можно более автономными, чтобы они могли быть скомпилированы самостоятельно. Избегайте использования предварительных объявлений, если это возможно, и используйте другие заголовочные файлы, если это необходимо.
4
пробела.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )