Вебсервер Station922
|
|
zamabuvaraeu | Дата: Вторник, 14.06.2022, 11:12 | Сообщение # 1 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Посмею представить на общественное порицание и обсуждение свой вебсервер на бейсике «Station922».
Коротко.
1. Да данный момент: поддерживаются только методы GET и HEAD, HTTPS не поддерживается, CGI не поддерживается. 2. Для Windows начиная с XP и старше. Возможно будет работать под Wine. 3. Адрес и порт для прослушивания в файле WebServer.ini. По умолчанию слушает localhost и порт 80. Можно указать конкретный IP‐адрес сетевой карты, 0.0.0.0 или имя компьютера (слушать со всех адресов). 4. Список сайтов в файле WebSites.ini. Имя секции — это адрес сайта, то, что вводится в строку браузёра. Ключ PhisycalDir — путь к каталогу, где лежат ваши *.html. Исправьте на свой. 5. Екзешник лежит в каталоге bin. Тот, который будет запустить «по щелчку мыши», — с суффиксом Console. 6. Изкоробки: устанавливаем PhisycalDir в тот путь, где лежат ваши default.htm, открываем браузёр и вводим http://localhost/. Сервер отправит запрошенный файл, и брузеавр его отобразит.
Каталог obj нужен для складирования объектных файлов (удалены из архива). В каталогах Classes, Headers, Interfaces, Modules, Resources — исходные коды. Екзешник с суффиксом Service работает как служба Windows, её можно установить утилитой sc. Щелчком мыши не запустится.
Для сборки из исходников понадобится утилита make (mingw32-make). Устанавливаем пути к цепочке инструментов пакетным файлом setcompilerpath_gcc-09.3.0_x64.cmd (или setcompilerpath_gcc-09.3.0_x86.cmd), и запускаем run_make.cmd (исправьте пути на ваши).
Отладочная версия выводит много информации в консоль, но работает медленно. Релизная версия пишет в консоль только ошибки.
Не стесняемся выискивать недостатки, тестировать на сверхвысокую нагрузку, придираться к коду и просто высказывать своё скептическое фи.
Ссылка на репозитуарий https://github.com/BatchedFiles/Station922
|
|
| |
haav | Дата: Среда, 15.06.2022, 09:56 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Слишком мудрено у тебя сделана сборка из исходников. Я вроде установил все пути кроме CLANG и мелкософтовских (у меня не стоит среда и ставить ее нет желания). Кроме того , большинство путей для fbc, ar , ld и пр. можно было прописать с помощью переменной , чтобы не править 10 строчек. В любом случае вылезла проблема:
Цитата move /y Classes\CreateInstance.c obj\Release\x86\CreateInstance_Console_GCC-09.3 .0_FBC-1.09.0_-Rt-Mingw+W.c process_begin: CreateProcess(NULL, move /y Classes\CreateInstance.c obj\Release\ x86\CreateInstance_Console_GCC-09.3.0_FBC-1.09.0_-Rt-Mingw+W.c, ...) failed. make (e=2): Не удается найти указанный файл. mingw32-make: *** [Makefile:634: obj\Release\x86\CreateInstance_Console_GCC-09.3 .0_FBC-1.09.0_-Rt-Mingw+W.c] Error 2
Дальше копаться не стал.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Среда, 15.06.2022, 14:42 | Сообщение # 3 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Исправил:
1. В коде: не отдавать тело ответа при методе HEAD. 2. В Makefile вместо команды move теперь вызываю cmd.exe /c "move ..." 3. Исправил файл установки путей к цепочке инструментов.
Казалось бы, зачем там вообще нужно move? А всё потому, что FreeBASIC кладёт промежуточный *.c файл рядом с *.bas файлом, а мне надо, чтобы этот файл был в папке с объектными файлами. Выкрутился перемещением через move.
В ближайшее время буду реализовывать асинхронный accept.
|
|
| |
haav | Дата: Среда, 15.06.2022, 20:57 | Сообщение # 4 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Цитата zamabuvaraeu ( ) Казалось бы, зачем там вообще нужно move? А всё потому, что FreeBASIC кладёт промежуточный *.c файл рядом с *.bas файлом, а мне надо, чтобы этот файл был в папке с объектными файлами. Выкрутился перемещением через move.
А по итогу:
Цитата gcc.exe: error: objReleasex86ArrayStringWriter_Console_GCC-09.3.0_FBC-1.09.0_-Rt -Mingw+W.c: No such file or directory gcc.exe: fatal error: no input files compilation terminated.
Файл перемещается и находится в нужной папке. Если вводить команду для компиляции вручную , то он компилируется в asm. Но вводить вручную команды для сборки в *.asm , потом в *.o для каждого файла запаришься. Что-то не то в твоем makefile.
P.S. для тестирования всегда надо иметь отдельную систему , хотя бы на виртуалке. И там установив чистый компиль от разрабов , проверять собирается ли твой проект.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Среда, 15.06.2022, 23:55 | Сообщение # 5 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Так‐то на Windows XP и 10 всё работает. Какие‐то проблемы с разделителями путей? А вы на линуксе собираете, так?Добавлено (16.06.2022, 00:36) --------------------------------------------- Я‐то думаю, что это команда move не работает. А такого названия на Linux просто нет.
|
|
| |
zamabuvaraeu | Дата: Четверг, 16.06.2022, 02:26 | Сообщение # 6 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Добавил в файл "setcompilerpath_gcc-09.3.0_x64.cmd" две переменных, которые надо заменить:
Разделитель путей для Windows, на линуксе заменить на «/»: set PATH_SEP=\
Команда перемещения, тоже заменить set MOVE_COMMAND=move /y
Удалил лишние флаги и мёртвые цели из Makefile.
В архиве только обновлённые Makefile и зависимости, остальное не менялось.
|
|
| |
haav | Дата: Четверг, 16.06.2022, 08:26 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Я не стал бы парить мозги с линуксом и вине. У меня не собирается на Windows 7 32-bit.
Последний архив попробовал , но с этими правками файл физически не перемещается в папку obj\Release\x86 . С файлами из этого сообщения: http://freebasic.ucoz.com/forum/5-559-2992-16-1655293329 файл ArrayStringWriter_Console_GCC-09.3.0_FBC-1.09.0_-Rt-Mingw+W.c хотя бы перемещается , но gcc его почему-то не видит. Поэтому и появляется сообщение:
Цитата gcc.exe: error: objReleasex86ArrayStringWriter_Console_GCC-09.3.0_FBC-1.09.0_-Rt -Mingw+W.c: No such file or directory gcc.exe: fatal error: no input files compilation terminated.
Если после этой ошибки вручную ввести команду:
Цитата "D:\FB\bin\win32\gcc.exe" -Wall -Werror -Wno-unused-label -Wno-unused-function -Wno-unused-variable -Wno-main -Werror-implicit-function-declaration -nostdlib -nostdinc -fno-strict-aliasing -frounding-math -fno-math-errno -fno-exceptions -fno-ident -fdata-sections -ffunction-sections -mno-stack-arg-probe -fno-stack-check -fno-stack-protector -fno-unwind-tables -fno-asynchronous-unwind-tables -masm=intel -S -Ofast obj\Release\x86\ArrayStringWriter_Console_GCC-09.3.0_FBC-1.09.0_-Rt-Mingw+W.c -o obj\Release\x86\ArrayStringWriter_Console_GCC-09.3.0_FBC-1.09.0_-Rt-Mingw+W.asm
То данная команда срабатывает и файл *.asm создается.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Четверг, 16.06.2022, 16:55 | Сообщение # 8 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| У меня версия make: Код GNU Make 4.3 Built for x86_64-w64-mingw32 Copyright (C) 1988-2020 Free Software Foundation, Inc.
Вот что в самой mingw, из которой я использую make: Код winlibs personal build version gcc-10.2.0-mingw-w64-7.0.0-r4
This is the winlibs 64-bit standalone build of: - GCC 10.2.0 - GDB 9.2 - MinGW-w64 7.0.0 - GNU Binutils 2.35 - GNU Make 4.3 - PExports 0.47 - dos2unix 7.4.1 - Yasm 1.3.0 - NASM 2.15.04 - JWasm 2.12pre
This build was compiled with GCC 10.2.0 and packaged on 2020-08-22.
Если настройках переменных среды указать:
Код set PATH_SEP=\\ set PROCESSOR_ARCHITECTURE=AMD64 set MOVE_COMMAND=cmd.exe /c move /y
Это сработает?
|
|
| |
haav | Дата: Четверг, 16.06.2022, 18:46 | Сообщение # 9 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Так и у меня примерно такое же:
Цитата gcc (Rev2, Built by MSYS2 project) 11.2.0 GNU Make 4.3
Цитата Если настройках переменных среды указать:
нет , это не работает. Я не знаю , в чем дело. Возможно это только у меня что-то не так. Если изменить разделитель путей на обратный , то 1 файл собирается , а со следующим опять какие-то проблемы с move. Может кто еще попробует и скажет работает это или нет.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Alex_Artifex | Дата: Четверг, 16.06.2022, 19:06 | Сообщение # 10 |
Сержант
Группа: Пользователи
Сообщений: 22
Статус: Offline
| Хорошее начало. Я пока не смотрел исходники твоего проекта. Думаю надо продолжать, всего что связано с сетями в ФБ недостаточно, я имею в виду нормально проработанного и применимого. Я видел много всего, но это были тонны непонятного кода. (я не говорю, что нет ничего толкового, есть пара либ, например от DJ Petersa). Желаю продолжения.
|
|
| |
zamabuvaraeu | Дата: Понедельник, 20.06.2022, 08:07 | Сообщение # 11 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| haav, Ну, ШТОШ. Версии MINGW вроде одинаковые, а сборки точно разные. У меня сборка от Бреча Сандерса.
Я брал ту, что с темы на форуме https://www.freebasic.net/forum/viewtopic.php?t=31376
Вот эти ссылки:
https://github.com/brechts....sjlj.7z
https://github.com/brechts....sjlj.7z
На всякий случай добавил самодостаточный пакетный файл для компиляции. Запускаем — и всё соберётся, вначале поправить пути к цепочке инструментов. Недостаток: каждая сборка будет перестраивать весь проект, без проверки зависимостей.Добавлено (20.06.2022, 08:11) --------------------------------------------- Код Если изменить разделитель путей на обратный , то 1 файл собирается , а со следующим опять какие-то проблемы с move.
Предполагаю разное поведение с разделителями путей:
1. make требует разделить путей в виде / 2. move требует разделить путей в виде \
Скоро придумаю как это совместить.
|
|
| |
haav | Дата: Понедельник, 20.06.2022, 20:19 | Сообщение # 12 |
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Статус: Offline
| Да , теперь с помощью батника собирается без проблем. Попробовал погонять один из своих локальных сайтов , вроде все хорошо. Спасибо , что поделился своей разработкой!
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
zamabuvaraeu | Дата: Среда, 29.06.2022, 10:53 | Сообщение # 13 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| Тут статью передали «Как создавать кроссплатформенные makefile» Sebastien Kramm: Writing portable makefiles (skramm.blogspot.com)
|
|
| |
DarkDemon | Дата: Четверг, 30.06.2022, 14:06 | Сообщение # 14 |
Полковник
Группа: Друзья
Сообщений: 194
Статус: Offline
| Ты говорил, что пишешь новую версию асинхронную. Старая была функциональнее?
|
|
| |
zamabuvaraeu | Дата: Пятница, 15.07.2022, 20:23 | Сообщение # 15 |
Подполковник
Группа: Друзья
Сообщений: 149
Статус: Offline
| DarkDemon, в старой больше методов работало. Но это не потому, что асинхронная версия не может их поддерживать. Это потому, что рука не дошла их написать. Пока работают только GET, HEAD, OPTIONS, TRACE, на очереди PUT, POST, CONNECT, DELETE.
Я тут упростил кодовую базу, теперь можно не заморачиваться с Makefile. Получаем актуальную версию исходников так:
Заходим в src и компилируем всё таким пакетным файлом:
Код set FREEBASIC_COMPILER_DIRECTORY=C:\Program Files (x86)\FreeBASIC-1.09.0-win64-gcc-9.3.0 set FREEBASIC_COMPILER_64="%FREEBASIC_COMPILER_DIRECTORY%\fbc64.exe" set FREEBASIC_COMPILER_32="%FREEBASIC_COMPILER_DIRECTORY%\fbc32.exe" set OPTIMIZATIONS=-O 3 -gen gcc -Wc -ffunction-sections,-fdata-sections -Wl --gc-sections
%FREEBASIC_COMPILER_64% -m Station922 -x Station922_64.exe %OPTIMIZATIONS% *.bas *.rc %FREEBASIC_COMPILER_32% -m Station922 -x Station922_86.exe %OPTIMIZATIONS% *.bas *.rc
Если нужна отладочная версия: «set OPTIMIZATIONS=-O 0 -g -gen gcc».
Также не забываем, что в каталоге с исполняемым файлом должны лежать файлы WebServer.ini и WebSites.ini (входят в кодовую базу).Добавлено (15.07.2022, 20:55) --------------------------------------------- Потестировал утилитой ab.exe скорость ответа сервера на 10 тысяч соединений. Тестировать следует на разных машинах, чтобы сервер и утилита друг с другом не интерполировали.
Результаты:
Код C:\Soft\Apache24\bin>ab.exe -k -n 100000 -c 10000 http://www.freebasic.su/
Server Software: Server Hostname: www.freebasic.su Server Port: 80
Document Path: / Document Length: 12089 bytes
Concurrency Level: 10000 Time taken for tests: 147.334 seconds Complete requests: 100000 Failed requests: 0 Keep-Alive requests: 100000 Total transferred: 1238200000 bytes HTML transferred: 1208900000 bytes Requests per second: 678.73 [#/sec] (mean) Time per request: 14733.406 [ms](mean) Time per request: 1.473 [ms](mean, across all concurrent requests) Transfer rate: 8207.06 [Kbytes/sec] received
Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 17.8 0 1016 Processing: 454 11172 5396.4 11023 44587 Waiting: 2 6080 5119.5 5426 44583 Total: 454 11172 5397.3 11023 44590
Percentage of the requests served within a certain time (ms) 50% 11023 66% 11215 75% 11514 80% 11849 90% 15874 95% 18343 98% 22509 99% 43239 100% 44590 (longest request)
Полторы миллисекунды на ответ — это как‐то многовато. Есть ещё что оптимизировать!
|
|
| |
|