Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа web-сервера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Twen
Добрый день, имеется отладочная плата от Олимекс STM32 - P107, на сайте я скачал демо-программу работы веб-сервера http://olimex.com/dev/index.html , название файла Ethernet Demo software for EW-ARM 5.50.

Веб-сервер работает, но хотелось бы разобраться в алгоритме отображения веб-страниц...комментарий у программе не особо много...

Если, кто-то работал с веб-сервером пишите...
Спасибо.
scifi
Цитата(Twen @ Aug 2 2011, 16:27) *
Если, кто-то работал с веб-сервером пишите...

Пишу. Работал. Только веб-сервер сделал своими руками.
Или Вам нужна консультация конкретно по Олимексу?
Twen
Это заслуживает уважения!

Есть пример реализации веб-сервера http://olimex.com/dev/index.html , я его запустил и он работает, но хотелось бы разобраться с его работой...например у примере под олимекс реализован сайт, который состоит из нескольких страниц, мне хотелось бы создать свой сайт (язык html знаю), но переделать сайт под свой не получается, так как сам алгоритм работы демо-программы не полностью разобрал...сейчас я могу реально у демо-программе изменить содержание текста страниц(там просто вписуется код на html у массив), а вот изменить главное меню или вывести какую-то переменную пока не знаю как...

Вообщем нужно разобраться с примером программы (выводом html страниц)...


Содержанние программы показано на рисунке...
Не могу понять где в программе постоенние сайта...в главном цикле программы происходит передача буфера uip_buf, а сам процесс его заполнения....
Arischenko Ivan
Цитата(Twen @ Aug 2 2011, 17:51) *
Не могу понять где в программе постоенние сайта...в главном цикле программы происходит передача буфера uip_buf, а сам процесс его заполнения....


"Сам" сайт скорее всего находится в файле httpd-fs.c. Прроцесс примерно следующий : есть сайт на диске, существует утилита которая переводит html в с-код (стурктуры), код вставляется в файл httpd-fs.c.
scifi
Цитата(Twen @ Aug 2 2011, 17:51) *
мне хотелось бы создать свой сайт (язык html знаю), но переделать сайт под свой не получается, так как сам алгоритм работы демо-программы не полностью разобрал...сейчас я могу реально у демо-программе изменить содержание текста страниц(там просто вписуется код на html у массив), а вот изменить главное меню или вывести какую-то переменную пока не знаю как...

Вообщем нужно разобраться с примером программы (выводом html страниц)...

По-видимому, веб-сервер взят из uIP 1.0. Домашняя страница проекта здесь.
Исходный код веб-страниц лежит в папке httpd-fs. Его можно править (дабавлять/убирать файлы). Исходный код преобразуется в файл httpd-fs.c (который, собственно, и включается в прошивку) при помощи перлового скрипта makefsdata. Как это делать, можно посмотреть здесь.
Веб-сервер, судя по всему, поддерживает простенький SSI и CGI. Например, заглянув в исходники веб-страниц, видим "%! net-stats" - вызов функции CGI "net-stats" и "%!: /footer.html" - подстановка содержимого файла "footer.html". Функции CGI содержатся в файле httpd-cgi.c, его и правим под свои нужды.
Как-то так.
Twen
Цитата
По-видимому, веб-сервер взят из uIP 1.0. Домашняя страница проекта здесь.


Скачал документацию на uIP 1.0 Web Server, почитал... документация состоит с вставок некоторых функций без ясного описания, это не радует...

Смотрите, структура сайта показана на рисунку 1:

У файле httpd_fsdata.c объявленные массивы с аски ссимволов для каждой из вкладок страницы:

static const unsigned char data_index_html[] = {
/* /index.html */
0x2f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0,
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20,
0x48, 0x54, 0x4d, 0x4c, 0x20, 0x50, 0x55, 0x42, 0x4c, 0x49,
.................
}
- массив с данными для закладки Front page

static const unsigned char data_files_shtml[] = {
/* /files.shtml */
0x2f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x2e, 0x73, 0x68, 0x74, 0x6d, 0x6c, 0,
0x25, 0x21, 0x3a, 0x20, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x65,
0x72, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0xa, 0x3c, 0x68, 0x31,
0x3e, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74,
}
- массив с данными для второй закладки - File statistics

и так далее для всех вкладок. Здесь у массивах код на html - это понятно.

А если я хочу вывести какую-то переменную, то как это сделать?

Я также искал по Аски символам где прописаны названия вкладок :
Front page File statistics Network statistics Network connections

но так и не нашел...где эти названия выводятся?

Потом для каждой из вкладок объявляются структуры:

const struct httpd_fsdata_file file_index_html = {&file_header_html, (char const*)data_index_html, (char const*)data_index_html + 12, sizeof(data_index_html) - 12};

Параметры структуры: адрес следующей структуры, имя вкладки, данные(массив), длинна массива)...

Потом с помощью адресов на эти структуры происходит вывод страницы...Можете пожалуйста его объяснить, в куче функций я просто потерялся...

Twen
Цитата
По-видимому, веб-сервер взят из uIP 1.0. Домашняя страница проекта здесь.
Исходный код веб-страниц лежит в папке httpd-fs.с


Я посмотрел файл httpd-fs.с, в нем находится 4 функции
static u8_t
httpd_fs_strcmp(const char *str1, const char *str2)
- функция сравнения строк

int
httpd_fs_open(const char *name, struct httpd_fs_file *file)
, параметры : имя файла и адрес структуры файла - функция открытия файла по имени
в переменную count[i] сохраняется количество открытий определенной закладки (Для статистики)

void
httpd_fs_init(void)
- инициализация, количество открытий = 0; (Для статистики)

u16_t httpd_fs_count
(char *name)
- функция определения количества открытий закладок, параметр - имя закладки


Вот, с файлом httpd-fs.c разобрался, осталось разобраться еще с 2 файлами: httpd-cgi.c и httpd.c.
scifi
Мне кажется, этот топик к АРМам не имеет практически никакого отношения. Модератор, перенесите в раздел для начинающих, пожалуйста.

Цитата(Twen @ Aug 3 2011, 12:22) *
Мне хотя бы пока что понять как например вывести на веб-страницу значение переменной web_var.

Мне казалось, что я всё уже написал выше. Разъяснений вплоть до уровня "нажмите эту кнопочку, потом вот эту" вряд ли дождётесь.
Twen
Можно узнать по поводу этой функции?

s->scriptpt - это выходит мы показываем, что мы передаем скрипт...кстати, скрипт - это и есть сам код страницы?

static
PT_THREAD(handle_script(struct httpd_state *s))
{
char *ptr;

PT_BEGIN(&s->scriptpt);


while(s->file.len > 0) {

/* Check if we should start executing a script. */
if(*s->file.data == ISO_percent &&
*(s->file.data + 1) == ISO_bang) {
s->scriptptr = s->file.data + 3;
s->scriptlen = s->file.len - 3;
if(*(s->scriptptr - 1) == ISO_colon) {
httpd_fs_open(s->scriptptr + 1, &s->file);
PT_WAIT_THREAD(&s->scriptpt, send_file(s));
} else {
PT_WAIT_THREAD(&s->scriptpt,
httpd_cgi(s->scriptptr)(s, s->scriptptr));
}
next_scriptstate(s);

/* The script is over, so we reset the pointers and continue
sending the rest of the file. */
s->file.data = s->scriptptr;
s->file.len = s->scriptlen;
} else {
/* See if we find the start of script marker in the block of HTML
to be sent. */

if(s->file.len > uip_mss()) {
s->len = uip_mss();
} else {
s->len = s->file.len;
}

if(*s->file.data == ISO_percent) {
ptr = strchr(s->file.data + 1, ISO_percent);
} else {
ptr = strchr(s->file.data, ISO_percent);
}
if(ptr != NULL &&
ptr != s->file.data) {
s->len = (int)(ptr - s->file.data);
if(s->len >= uip_mss()) {
s->len = uip_mss();
}
}
PT_WAIT_THREAD(&s->scriptpt, send_part_of_file(s));
s->file.data += s->len;
s->file.len -= s->len;

}
}

PT_END(&s->scriptpt);
}




Цитата
Разъяснений вплоть до уровня "нажмите эту кнопочку, потом вот эту" вряд ли дождётесь


Мне это и не нужно. Просто разбираться в программе, которая не полностью прокомментированы переменные не так и легко...просто хочется разобраться, уже пару дней разбираюсь...
promelectronshchic
Код как по мне, то криво написан, чтобы изменить сайт, нужно неплохо поковыряться по программе...да и нормального описания программы действительно нету.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.