{"id":18153271,"url":"https://github.com/30mb1/cgi_server","last_synced_at":"2025-07-09T05:39:54.951Z","repository":{"id":94105510,"uuid":"85349760","full_name":"30mb1/CGI_server","owner":"30mb1","description":"Simple CGI server on C using sockets.","archived":false,"fork":false,"pushed_at":"2018-09-04T12:35:30.000Z","size":43,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-07T00:52:26.131Z","etag":null,"topics":["c","cgi","cgi-server","linux-server","network-programming","server","socket-programming","socket-server"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/30mb1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-03-17T19:56:00.000Z","updated_at":"2024-08-05T14:28:09.000Z","dependencies_parsed_at":"2023-04-04T12:47:56.393Z","dependency_job_id":null,"html_url":"https://github.com/30mb1/CGI_server","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/30mb1/CGI_server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/30mb1%2FCGI_server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/30mb1%2FCGI_server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/30mb1%2FCGI_server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/30mb1%2FCGI_server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/30mb1","download_url":"https://codeload.github.com/30mb1/CGI_server/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/30mb1%2FCGI_server/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264402445,"owners_count":23602594,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c","cgi","cgi-server","linux-server","network-programming","server","socket-programming","socket-server"],"created_at":"2024-11-02T03:06:11.601Z","updated_at":"2025-07-09T05:39:54.706Z","avatar_url":"https://github.com/30mb1.png","language":"C","readme":"# web-server с функциональностью CGI #\n\nCGI - это стандарт интерфейса, используемый для связи внешней программы для связи с сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» или «CGI-программа». По сути позволяет использовать консоль ввода и вывода для взаимодействия с клиентом.\n\nСам интерфейс разработан таким образом, чтобы можно было использовать любой язык программирования, который может работать со стандартными устройствами ввода-вывода. Такими возможностями обладают даже скрипты для встроенных командных интерпретаторов операционных систем, поэтому в простых случаях могут использоваться даже командные скрипты.\n\nCGI является одним из наиболее распространённых средств создания динамических сайтов. Этот стандарт используют такие популярные веб-сервера, как например, [Nginx](https://ru.wikipedia.org/wiki/Nginx) или [Apache](https://ru.wikipedia.org/wiki/Apache_HTTP_Server).\n\n\n## OVERVIEW ##\n\nСервер умеет закрепляться на определенному хост:порт и слушать входящие соединения. На заданном адресе выдается HTML-страничка, если запрос корректен, либо страница с ошибкой 404, если запрашиваемой страницы не существует. Также реализован cgi-скрипт показывающий время при нажатии на кнопки на главной странице.\n\n## DOCUMENTATION ##\n\n\n```\n#!\n\nhtdocs/\ncgi-bin/\ninstall.c\nutility.c\nutility.h\nmain.c\nMakefile\n```\n\n* *htdocs* содержит всю статику: HTML и CSS файлы сервера.\n* В *cgi-bin* хранятся используемые cgi-скрипты - на данный момент только программа, выводящая текущую дату/время.\n* *install.c* это установочный скрипт, создающий .service файл для оформления сервера как службы systemd.\n* *main.c* - содержит все функции, отвечающие за настройку и запуск сервера.\n* *utility.c* - включает некоторые вспомогательные функции, такие как парсинг запроса клиента char * parse_request(...), поиск запрашиваемых файлов и отправка их клиенту void GET(...) и тд.\n* *Makefile* - установочный make-file, содержащий все инструкции по компиляции и установке сервера.\n\n\n## INSTALLING AND RUNNING SERVER ##\n\n Устанавливаем с помощью make. Установочный скрипт скомпилирует и переместит исполняемый файл в папку /usr/local/bin, затем создаст .service файл и поместит его в /etc/systemd/system/:\n\n\n```\n\ncd cgi/\nmake install\n```\n\nСервер теперь можно запускать так же, как и системные службы(работает только на Ubuntu,\nт.к помещает юнит-файл в папку /etc/systemd/system/, которая не является установочной на \n других системах). По дефолту сервер запустится на 127.0.0.1:1235. Чтобы выставить свои настройки, нужно изменить config файл:\n\n\n```\n\nservice cgi start\nservice cgi stop\n```\n\n## HOW IT WORKS ##\n\nПри запуске программа создает PID файл, в который записывает ID текущего процесса, чтобы в дальнейшем можно было послать на него сигнал для завершения работы. Если во время старта сервера возникла ошибка, файл не создается.\n\n\n```\n#!c\n\n//creating PID file\nFILE * file = fopen(path_to_pidfile, \"a+\");\nfprintf(file, \"%d\", getpid());\nfclose(file);\n\n//killing running server\nFILE * file = fopen(path_to_pidfile, \"r+\");\nfscanf(file, \"%d\", \u0026pid);\nkill(pid, SIGTERM);\nfclose(file);\nremove(path_to_pidfile);\n```\nДалее с помощью набора функций для работы с сокетами настраиваем наш сервер.\nЕсли все прошло без ошибок, начинаем принимать входящие соединения. Для каждого принятого соединения создаем отдельный процесс, родительский процесс при этом продолжает слушать.\n\n\n```\n#!c\n\npid_t pid = fork();\nif (0 == pid) { //if it is child process - interact connection\n    handle_request(client_socket, \u0026client_address, htdocs);\n    exit(0);\n} else { //otherwise close socket and continue listening\n    close(client_socket);\n}\n```\n\nДочерний процесс считывает запрос, обрабатывает его и выдает страницу ответ: если файл был найден, то выдается соответствующая страничка, в противном случае пользователь получит страницу с ошибкой 404. Вся статика хранится в папке htdocs сервера.\n\n\n```\n#!c\n\nread(client_socket, recv_buffer, sizeof(recv_buffer));\nchar *query_str = parse_request(recv_buffer);\n...\nGET(client_socket, query_str, maindir);\n```\n\nПри нажатии на главной странице на кнопку \"get current time\" выполняется скрипт, возвращающий текущую дату/время:\n\n\n```\n#!c\n\nif (strcmp(query_str + strlen(query_str) - 4, \"cgi?\") == 0) {\n        ...\n        execve(main_dir, arg, empty2); //execute cgi-script\n        close(client_socket);\n}\n\n```\n\n### Отчет по проделанной работе ###\n\nНа данный момент реализовано:\n\n1. Веб-сервер выдает статические страницы и обслуживает одновременно несколько подключений.\n2. Сервер оформлен в виде службы для systemd.\n3. Сервер корректно обрабатывает ошибочные запросы.\n4. Сервер умеет работать со сторонними программами и выдавать результат их работы(на стадии разработки).\n\nComing soon:\n\n1. Поддержка POST запросов.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F30mb1%2Fcgi_server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F30mb1%2Fcgi_server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F30mb1%2Fcgi_server/lists"}