Практика, 2 курс, руководитель Ключев А.О.

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 22 май 2009, 18:39

Здравствуйте. Судя по всему, работу я над практикой я продолжу летом - сейчас времени дико не хватает. :(
Наработки видимо буду посылать через этот форум. Пока что есть черновой набросок протокола для общения АРМ->сервер->терминал. Чем то он напоминает протокол FTP - по одному соединению команды для соединения, по другому данные (команды для терминалов\рабочих мест).
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 22 май 2009, 19:06

Это хорошо.

Нельзя забывать один важный момент. Практика заключается не столько в изготовлении чего-либо, сколько в получении новых впечатлений, знаний, в общении с людьми. Желательно приходить на Биржевую для общения. Будет возможность, устроим небольшую практику на производственном участке.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 23 май 2009, 08:10

С радостью сходил бы, но у меня сейчас начинается зачетная неделя и после сессия :o
А на следующий день после сессии я уже уезжаю из города.
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 09 июл 2009, 21:51

Наконец-то сессия кончилась и появилось свободное время. Написал описание используемого прикладного протокола, на его основе уже пишу управляющую программу для терминала - как следствие менять протокол думаю уже не буду. Если поменяю - выложу изменения сюда.
Вложения
protodesc.pdf.bz2
Описание прикладного протокола
(204.83 Кб) Скачиваний: 239
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 10 июл 2009, 17:32

h0rr0rr_drag0n писал(а):Наконец-то сессия кончилась и появилось свободное время. Написал описание используемого прикладного протокола, на его основе уже пишу управляющую программу для терминала - как следствие менять протокол думаю уже не буду. Если поменяю - выложу изменения сюда.


Выложи просто PDF. Заархивированный pdf - моветон некомильфастый...
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 11 июл 2009, 15:39

Привык место экономить.
Вложения
protodesc.pdf
(218.66 Кб) Скачиваний: 381
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 13 июл 2009, 11:15

h0rr0rr_drag0n писал(а):Привык место экономить.


Не у всех под рукой есть bzip, пожалей людей...

Прочитал, замечания следующие.
1. У документа должны быть название и автор. Еще, полезно ставить дату создания. Иначе, когда таких документов много, создаётся дикая путаница. У меня их очень много.
2. Для описания протокола мало формата пакетов. Нужно еще, как минимум, описать порядок взаимодействия между узлами. Иначе, это описание можно трактовать кучей способов, оно неоднозначно.

Для описания протоколов можно использовать UML. Отдельные узлы хорошо описываются конечным автоматом (диаграмма состояний), а особо злачные примеры сценариев взаимодействия узлов - диаграммой последовательности.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 19 июл 2009, 23:21

Исправил.
Предпочитаемый язык программирования: для клиента-терминала и сервера - C. Для клиента-АРМ - С++.
protodesc.pdf
Описание протокола, вторая версия.
(292.47 Кб) Скачиваний: 345
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 22 июл 2009, 12:46

h0rr0rr_drag0n писал(а):Исправил.
Предпочитаемый язык программирования: для клиента-терминала и сервера - C. Для клиента-АРМ - С++.
protodesc.pdf


Ну, уже получше. По поводу формата пакетов у меня вопрос. А как понять порядок байтов у двухбайтовых значений?
И еще, какие уровни реализованы в рамках семиуровневой модели ISO/OSI ?
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 22 июл 2009, 22:43

Поскольку заранее неизвестно, совпадает ли порядок байтов на узлах клиентов, то все двух- и четырехбайтовые (размер блока данных) значения в заголовках пакетов будут приводиться к сетевому порядку байтов функциями htons() и htonl(), а лишь потом отправляться получателю. На стороне получателя эти значения будут приводится к порядку байтов, принятому на узле функциями ntohs() и ntohl(), а лишь потом использоваться. Массив зашифрованных данных будет отправляться как есть (если в нем будут передаваться двух- или четырехбайтовые значения, то будем поступать так же, как и описано выше).
Если верить http://ru.wikipedia.org/wiki/Сетевая_модель_OSI, то я реализовал прикладной, представительский и сеансовый уровни (надо же O_o...).
Библиотекой, предоставляющей мне готовые функции для шифрования блоков данных по алгоритму RSA, будет OpenSSL
Описание протокола со всеми сделанными изменениями выложу завтра.
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 23 июл 2009, 12:22

h0rr0rr_drag0n писал(а):Поскольку заранее неизвестно, совпадает ли порядок байтов на узлах клиентов, то все двух- и четырехбайтовые (размер блока данных) значения в заголовках пакетов будут приводиться к сетевому порядку байтов функциями htons() и htonl(), а лишь потом отправляться получателю.


Суть вот в чем... Когда делаешь описание протокола, не факт, что кто-то другой будет использовать аналогичные функции. Поэтому, порядок байтов нужно указывать всегда.

Если верить http://ru.wikipedia.org/wiki/Сетевая_модель_OSI, то я реализовал прикладной, представительский и сеансовый уровни (надо же O_o...).
Библиотекой, предоставляющей мне готовые функции для шифрования блоков данных по алгоритму RSA, будет OpenSSL
Описание протокола со всеми сделанными изменениями выложу завтра.


Тогда вопрос, если у нас аж три уровня, то в реализации это должно быть как-то отражено. Ведь общение между хостами идёт парралельно, между тремя уровнями сразу (уровень(i) - уровень(i) ). Для каждого уровня свой протокол (свои пакеты, свой алгоритм обмена этими пакетами). Как всё это реализовано?
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 23 июл 2009, 22:11

На прикладном уровне мы формируем блок данных или код ошибки\команды. Формат блока данных в описании не определен, потому что заранее неизвестно, какие именно данные будут передаваться по сети. Это обеспечивает возможность адаптировать протокол под любой набор данных, который мы пожелаем передать по сети.
Далее данные, сформированные на прикладном уровне, передаются на представительский уровень. На этом уровне блок данных шифруется, считается его размер и CRC. Код ошибки\команды не затрагиваются. Добавляются null-terminate байт в конец и адрес отправителя в заголовок.
Блок данных, сформированный на представительском уровне, передается вниз на сеансовый уровень. На сеансовом уровне к заголовку пакета добавляется адрес получателя и байт типа пакета (переданный с предыдущих уровней). Затем уже сформированный пакет отправляется в сеть.
Отправкой и получением пакетов занимается только сеансовый уровень. Алгоритмы его работы для узлов сети уже даны в описании протокола.
При получении пакета приложением, пакет проходит все уровни в обратном порядке. Ошибка, произошедшая на любом из этих трех уровней, вызывает формирование кода ошибки и посылку пакета с ошибкой по сети. Обработка полученного пакета естественно прекращается.
Сервер, координирующий работу всего этого работает на сеансовом уровне. Два оставшихся уровня ему не нужны.
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 03 авг 2009, 19:32

Выкладываю измененный protodesc - все, что писал здесь на форуме + уточнены детали шифрования пакетов, чтобы не было вольного толкования этого процесса.
Также выложен исходный код сервера, клиента - АРМ и клиента - терминала. В данный момент отлаживаю все это...
protodesc.pdf
Описание протокола - свежая версия.
(292.55 Кб) Скачиваний: 376

termprogs.tar.gz
(20.02 Кб) Скачиваний: 262

termprogs.zip
(36.95 Кб) Скачиваний: 323


Контрольные суммы:
16287f6075065b270afb35d0ead0f998 termprogs.tar.gz
a2461d7fde5c469ff8a13ebf5aff30c5 termprogs.zip
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 10 авг 2009, 08:30

Исправлено много ошибок - теперь все работает.
Сервер можно скомпилировать через make debug - он будет выводить отладочную информацию о подключившихся клиентах и пришедших пакетах. После запуска сервера (termserv) нужно запустить программу обеспечивающую работу терминала - termemu. Затем надо запустить управляющую программу (termanage), указав ей в качестве аргументов (подробнее termanage --help) IP и порт запущенного клиента-терминала (можно посмотреть в отладочном выводе сервера). Управляющая программа пошлет терминалу два запроса данных, выведет ответ на терминал, затем пошлет код завершения работы терминала и завершится.
В качестве "данных" используется строка "Hello world!". В принципе, легко использовать любые данные, надо лишь заново описать формат блока с данными для обоих типов клиентов.
Шифрования пока нет, код отвечающий за него пока закомментирован, но оно скоро будет.
Вместе с исходным кодом поставляются конфиги (sample.config) использующие интерфейс lo для работы программ. Указать путь к этому конфигу, вместо стандартного, можно указав опцию --config ./sample.config .
termprogs.tar.gz
(21.99 Кб) Скачиваний: 364

termprogs.zip
(38.54 Кб) Скачиваний: 222

MD5 суммы:
Код: Выделить всё
e1c8da43e82a620ed001bcb273034f41  termprogs.tar.gz
ccfd0507333234d5b2d7d6b9d8188301  termprogs.zip
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 10 авг 2009, 11:04

h0rr0rr_drag0n писал(а):Исправлено много ошибок - теперь все работает.[/code]


Посмотрел исходники, скомпилировал, запустил. Сервер жрёт 99% ресурсов CPU. Это не дело, нужно осваивать треды, процессы, IPC. Еще есть замечательная функция select, рекомендую.
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 10 авг 2009, 18:59

Раньше не имел привычки следить за тем, сколько ресурсов процессора жрут мои приложения. Теперь буду.
Сервер жрет столько ресурсов, потому что он в бесконечном цикле опрашивает наборы сокетов на готовность чтения или записи. В принципе, можно блокироваться в первом вызове select() ожидая прихода данных от клиента, поскольку, пока данные не придут, проверять набор сокетов на готовность к записи и посылать что-либо по сети бессмысленно. Это исправление я и сделал - теперь в топе top'а ни сервер, ни клиенты не показываются.
Контекстный патч для termserv/net.c:
Код: Выделить всё
*** ../net.c   2009-08-09 20:16:29.000000000 +0400
--- net.c   2009-08-10 14:10:28.000000000 +0400
***************
*** 344,359 ****
 
     while (1) {
        rset = allset;
!       memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = 0;
!       tivl.tv_usec = 0;
!       if ((nready = select(maxfd + 1, &rset, NULL, NULL, &tivl)) < 0) {
           syslog(LOG_ERR, "Error select(): %s\n", strerror(errno));
           goto shutdown;
        }
-       if (nready == 0){
-          goto selectwrite;
-       }
        /* соединение с новым клиентом */
        if (FD_ISSET(lawsfd, &rset)) {
           if ((connfd = accept(lawsfd, (struct sockaddr *)&cliaddr,
--- 344,353 ----
 
     while (1) {
        rset = allset;
!       if ((nready = select(maxfd + 1, &rset, NULL, NULL, NULL)) < 0) {
           syslog(LOG_ERR, "Error select(): %s\n", strerror(errno));
           goto shutdown;
        }
        /* соединение с новым клиентом */
        if (FD_ISSET(lawsfd, &rset)) {
           if ((connfd = accept(lawsfd, (struct sockaddr *)&cliaddr,
***************
*** 459,467 ****
           }
        }
 
- selectwrite:
        memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = 0;
        tivl.tv_usec = 0;
        FD_ZERO(&wset);
        wset = allset;
--- 453,460 ----
           }
        }
 
        memset(&tivl, 0, sizeof(tivl));
!       tivl.tv_sec = TIME;
        tivl.tv_usec = 0;
        FD_ZERO(&wset);
        wset = allset;

Также заметил, что termemu не обрабатывает завершение сервера, а так и продолжает крутиться в бэкграунде. Ну тут все исправилось довольно просто - нужно обрабатывать EOF, получаемый read(), в случае закрытия другой стороны соединения.
Контекстный патч для termemu/net.c:
Код: Выделить всё
*** ../net.c   2009-08-10 14:31:49.000000000 +0400
--- net.c   2009-08-10 18:36:34.000000000 +0400
***************
*** 170,175 ****
--- 170,177 ----
        if (readretval == -1) {
           syslog(LOG_ERR, "Error reading packet from socket: %s\n", strerror(errno));
           goto shutdown;
+       } else if (readretval == 0) { /* сервер закрыл соединение */
+          goto shutdown;
        }
        /* Мы прочитали пакет до конца, не прервавшись по таймауту.
         * Переходим к обработке полученного пакета
***************
*** 208,214 ****
              default: /* получили то, что не должны были получить */
                 break;
           } /* switch (incoming_pckt[0]) */
!       } /* if (readretval != -2) */
 
        /* Проверяем буфер отправки данных.
         * Если он не пуст - отправляем из него данные в сеть.
--- 210,216 ----
              default: /* получили то, что не должны были получить */
                 break;
           } /* switch (incoming_pckt[0]) */
!       } /* if (readretval > 0) */
 
        /* Проверяем буфер отправки данных.
         * Если он не пуст - отправляем из него данные в сеть.

Для тех, у кого отсутствует patch - архивы с termemu и termserv:
termemu_and_termserv.zip
(26.79 Кб) Скачиваний: 216

termemu_and_termserv.tar.gz
(17.27 Кб) Скачиваний: 280

MD5 суммы:
Код: Выделить всё
d3c01f63548fbca3998b0f2303f4fccb  termemu_and_termserv.tar.gz
032521140ddc10afd74be7b39b3262ee  termemu_and_termserv.zip
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 12 авг 2009, 12:24

Отладил код отвечающий за шифрование. Вместе с клиентом для АРМ и для терминала поставляются закрытый и открытый ключи соответственно. Сгенерировать ключи можно командами:
Код: Выделить всё
openssl genrsa -out privkey.pem 2048
openssl rsa -in privkey.pem -out pubkey.pem -pubout

Также исправил потенциальную уязвимость в сервере - можно было заполнить очередь пакетов пакетами для несуществующего получателя и полезным пакетам не осталось бы места. Теперь в конце бесконечного цикла сервера вызывается функция, чистящая буфер пакетов от пакетов для неподключенных к серверу получателей.
termprogs.tar.gz
(22.06 Кб) Скачиваний: 247

termprogs.zip
(39.9 Кб) Скачиваний: 208

MD5 суммы:
Код: Выделить всё
4ff968a0f6dc45b7bf7d3ccd339f2c6e  termprogs.tar.gz
d3a9b7a81caf93f46c5070080ef2a107  termprogs.zip
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение h0rr0rr_drag0n » 15 авг 2009, 19:52

Насколько я помню, нужно написать еще некую статью о практике в местной вики. Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?
Университет развивает все способности, в том числе — глупость.
-- Антон Павлович Чехов
Аватара пользователя
h0rr0rr_drag0n
 
Сообщения: 99
Зарегистрирован: 18 мар 2009, 22:27
Откуда: СПб

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение Интегральный вычислитель » 16 авг 2009, 14:08

Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?

Думаю ты будешь первопроходцем;
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?


Пароли в личку
I Have Seen The Truth And It Doesn't Make Any Sense
Аватара пользователя
Интегральный вычислитель
 
Сообщения: 561
Зарегистрирован: 02 апр 2008, 16:04
Откуда: из Леса

Re: Практика, 2 курс, руководитель Ключев А.О.

Сообщение kluchev » 17 авг 2009, 11:33

h0rr0rr_drag0n писал(а):Насколько я помню, нужно написать еще некую статью о практике в местной вики. Есть ли какой-нибудь шаблон для этих целей или стиль написания свободный?
И еще у меня нет доступа к самой местной вики; страница http://embedded.ifmo.ru/wiki/ запрашивает некие логин с паролем... Как их можно получить?


Примерно так:

Название статьи: Фамилия_И_О_Nгруппы_Месяц_Год
Категория: Практика на кафедре ВТ

Так у нас не будет пересечения между разными практикантами.

В отчёте перечисляется то, что сделано. Особое внимание нужно уделить тем вещам, которые на практике были наиболее интересны. Неплохо изложить техническую часть работы (примерно так, как это было сделано в представленном PDF). Отчёт желательно викифицировать (сделать ссылки на существующие статьи). Если каких либо статей нет, при желании их можно добавить (при этом необходимо использовать шаблон {{student}}).

http://embedded.ifmo.ru/wiki/index.php5 ... beddedWiki

Справки по нашей EmbeddedWiki: http://embedded.ifmo.ru/wiki/index.php5 ... 0%BA%D0%B0
В споре рождается коллективное заблуждение, а истиной мы его называем для краткости
Аватара пользователя
kluchev
 
Сообщения: 995
Зарегистрирован: 04 апр 2008, 13:31
Откуда: SPb

Пред.След.

Вернуться в Практика

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron