FreeBasic
Главная
Вход
Регистрация
Четверг, 28.03.2024, 17:39Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Freebasic » Исходники » Вебсервер Station922
Вебсервер Station922
zamabuvaraeuДата: Вторник, 14.06.2022, 11:12 | Сообщение # 1
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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
Прикрепления: Station922.zip (1.84 Mb)
 
haavДата: Среда, 15.06.2022, 09:56 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Исправил:

1. В коде: не отдавать тело ответа при методе HEAD.
2. В Makefile вместо команды move теперь вызываю cmd.exe /c "move ..."
3. Исправил файл установки путей к цепочке инструментов.

Казалось бы, зачем там вообще нужно move? А всё потому, что FreeBASIC кладёт промежуточный *.c файл рядом с *.bas файлом, а мне надо, чтобы этот файл был в папке с объектными файлами. Выкрутился перемещением через move.

В ближайшее время буду реализовывать асинхронный accept.
Прикрепления: 6093448.zip (1.85 Mb)
 
haavДата: Среда, 15.06.2022, 20:57 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Так‐то на Windows XP и 10 всё работает.
Какие‐то проблемы с разделителями путей? А вы на линуксе собираете, так?

Добавлено (16.06.2022, 00:36)
---------------------------------------------
Я‐то думаю, что это команда move не работает. А такого названия на Linux просто нет.

 
zamabuvaraeuДата: Четверг, 16.06.2022, 02:26 | Сообщение # 6
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Добавил в файл "setcompilerpath_gcc-09.3.0_x64.cmd" две переменных, которые надо заменить:

Разделитель путей для Windows, на линуксе заменить на «/»:
set PATH_SEP=\

Команда перемещения, тоже заменить
set MOVE_COMMAND=move /y

Удалил лишние флаги и мёртвые цели из Makefile.

В архиве только обновлённые Makefile и зависимости, остальное не менялось.
Прикрепления: Makefile.zip (17.9 Kb)
 
haavДата: Четверг, 16.06.2022, 08:26 | Сообщение # 7
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: 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
Репутация: 0
Статус: Offline
Хорошее начало. Я пока не смотрел исходники твоего проекта. Думаю надо продолжать, всего что связано с сетями в ФБ недостаточно, я имею в виду нормально проработанного и применимого.  Я видел много всего, но это были тонны непонятного кода. (я не говорю, что нет ничего толкового, есть пара либ, например от DJ Petersa). Желаю продолжения.
 
zamabuvaraeuДата: Понедельник, 20.06.2022, 08:07 | Сообщение # 11
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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 требует разделить путей в виде \

Скоро придумаю как это совместить.
Прикрепления: 0810746.zip (1.95 Mb)
 
haavДата: Понедельник, 20.06.2022, 20:19 | Сообщение # 12
Генералиссимус
Группа: Администраторы
Сообщений: 1361
Репутация: 49
Статус: Offline
Да , теперь с помощью батника собирается без проблем. Попробовал погонять один из своих локальных сайтов , вроде все хорошо. Спасибо , что поделился своей разработкой!

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
zamabuvaraeuДата: Среда, 29.06.2022, 10:53 | Сообщение # 13
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: Offline
Тут статью передали «Как создавать кроссплатформенные makefile»
Sebastien Kramm: Writing portable makefiles (skramm.blogspot.com)
 
DarkDemonДата: Четверг, 30.06.2022, 14:06 | Сообщение # 14
Полковник
Группа: Друзья
Сообщений: 188
Репутация: -2
Статус: Offline
Ты говорил, что пишешь новую версию асинхронную. Старая была функциональнее?
 
zamabuvaraeuДата: Пятница, 15.07.2022, 20:23 | Сообщение # 15
Подполковник
Группа: Друзья
Сообщений: 147
Репутация: 4
Статус: 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)


Полторы миллисекунды на ответ — это как‐то многовато. Есть ещё что оптимизировать!
 
Форум » Freebasic » Исходники » Вебсервер Station922
  • Страница 1 из 1
  • 1
Поиск: