OberonCore
https://forum.oberoncore.ru/

серверный режим через сеть
https://forum.oberoncore.ru/viewtopic.php?f=2&t=2116
Страница 1 из 2

Автор:  Info21 [ Воскресенье, 22 Ноябрь, 2009 22:24 ]
Заголовок сообщения:  серверный режим через сеть

Никто не думал? (Квази-) Серверный режим через TCP/IP.
В локальной сети или по какому-нить защищенному каналу.
Какую надо минимальную запускалочку? Какое-нибудь кеширование с проверкой обновлений?
Квази-браузер такой.

Автор:  Борис Рюмшин [ Воскресенье, 22 Ноябрь, 2009 23:10 ]
Заголовок сообщения:  Re: серверный режим через сеть

Хотите всё полностью по сети грузить? А на машине только файл пускач с поддержкой сети?

Над таким думали, но так как задача практики не касалась - в производство не пошло. :)

Нужно влинковать в экзешник поддержку сети и соответствующим образом модернизировать HostFiles. Как вариант.

Автор:  Info21 [ Понедельник, 23 Ноябрь, 2009 09:24 ]
Заголовок сообщения:  Re: серверный режим через сеть

Борис Рюмшин писал(а):
Хотите всё полностью по сети грузить? А на машине только файл пускач с поддержкой сети?
Типа. Чтобы не только с сетевого диска серверный режим устроить -- и отвязаться от конкретной ОСи.

И как дополнительный вариант: чтобы сам этот пускач мог работать в серверном режиме -- для локальных рабочих мест.
Правда, тут другая задача -- автообновление.
Но механизм подкачки модулей/кеширования тот же.

Автор:  id_ler [ Суббота, 28 Ноябрь, 2009 16:07 ]
Заголовок сообщения:  Re: серверный режим через сеть

Я объединял примеры ObxStreamsServer и ObxStreamsClient в один модуль и делал версии этого модуля для «машины-клиента» и «машины-сервера». Ключевое отличие:
Код:
 CONST
protocol = "CommTCP";
localAdr = "800"; (* адрес для машины-сервера   *)
(* localAdr = "900";  адрес для машины-клиента   *)
remoteAdr = "127.0.0.1:900";
(* remoteAdr = "127.0.0.1:800";
localAdr_s= "";
Далее, запускал два приложения ВВ и каждый своим модулем открывал порты(т.е. запускал сервер). Выделенная строка передается с «машины-клиента» на «машину-сервера» (и наоборот).

Автор:  Info21 [ Суббота, 28 Ноябрь, 2009 17:18 ]
Заголовок сообщения:  Re: серверный режим через сеть

id_ler писал(а):
Выделенная строка передается с «машины-клиента» на «машину-сервера» (и наоборот).
Непонятно, что за "выделенная строка".

Речь об эксперименте по передаче строки через tcp/ip?

Автор:  id_ler [ Суббота, 28 Ноябрь, 2009 19:05 ]
Заголовок сообщения:  Re: серверный режим через сеть

В подсистеме Comm(BlackBox Component Builder 1.5) находятся модули, которые реализуют канал TCP/IP, используя механизм сокетов ОС (для Windows). В папке Comm\Docu есть документация для модулей CommObxStreamsServer и CommObxStreamsClient – это сервер и клиент. Чтобы запустить их в совместную работу нужно в документации на CommObxStreamsServer стартовать сервер коммандером

(!)CommObxStreamsServer.Start

При этом ОС откроет порт 900 по своему внутреннему адресу 127.0.0.1, который в локальной сети может быть любым возможным.
Далее, в документации на CommObxStreamsClient нужно выделить любую строку текста и нажать коммандер

(!)CommObxStreamsClient.SendTextSelection

Вы увидите новое окно с текстом, который был выделен. Его создаст сервер. Чтобы остановить сервер и закрыть порт нужно нажать коммандер

(!)CommObxStreamsServer.Stop

Я же создал два процесса BlackBox.exe, каждый из которых открыл свой порт и через них передавал текст.

Автор:  Пётр Кушнир [ Суббота, 28 Ноябрь, 2009 19:21 ]
Заголовок сообщения:  Re: серверный режим через сеть

уважаемый, тут речь немного не о том. почитайте про серверный режим работы среды и использование ключа коммандной строки /use :)

Автор:  id_ler [ Среда, 02 Декабрь, 2009 13:04 ]
Заголовок сообщения:  Re: серверный режим через сеть

Пётр Кушнир писал(а):
уважаемый, тут речь немного не о том. почитайте про серверный режим работы среды и использование ключа коммандной строки /use :)

Мне кажется, что для задач указанных в параграфе 4 Серверная установка «Руководство пользователя», в рабочей директории удобно создавать файлы с временными именами, используя WinApi-функцию GetTempFileName. Она позволяет добавлять к префиксу имени файла, например, текущее системное время.

Попытался перевести такую программку с С++ при помощи утилиты с2ср из коллекции Helmut’а Zinn’а. Удивительно, что листинг перевода содержит GOTO и метки переходов. Указать правильные типы большого труда не составляет, но может быть есть более грубые нестыковки. Поэтому приведу оба листинга.
Код:
 LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
static HANDLE hFile;
static char   szTmpFile[MAX_PATH+1];
   switch( uMsg )
   {
      case WM_CREATE  :
              {
                 char szTmpPath[MAX_PATH+1];
                 GetTempPath( MAX_PATH, szTmpPath );
                 GetTempFileName( szTmpPath, "GEN", 0, szTmpFile );
                 hFile = CreateFile( szTmpFile, GENERIC_READ | GENERIC_WRITE,
                                     0, NULL, OPEN_ALWAYS,
                                     FILE_ATTRIBUTE_TEMPORARY, NULL );
              }
              break;

   ………………………………………………….

     case WM_DESTROY :
             if ( hFile )
              {
                 CloseHandle( hFile );
                 DeleteFile( szTmpFile );
              }
              PostQuitMessage(0);
              break;
      default :
            return( DefWindowProc( hWnd, uMsg, wParam, lParam ) );
   }
   return( 0L );
}

Код:
 (*-----------------------------------------------------------------------------
--   Von C nach Pascal ьbersetzt mit dem Program CTOPAS
--   (C) Helmut Zinn   V95/12/12
-----------------------------------------------------------------------------*)

MODULE TmpFile;

   IMPORT StdLog;

   PROCEDURE ^ WndProc (hWnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM) : LRESULT;
   
   VAR CALLBACKPROCEDURE WndProc (hWnd:HWND; uMsg:UINT; wParam:WPARAM; lParam:LPARAM) : LRESULT;
   LABEL L1;
         (*static*)VAR hFile : HANDLE;
   (*static*)VAR szTmpFile : ARRAY MAX_PATH+1 OF CHAR;
   BEGIN
       CASE uMsg OF
         | WM_CREATE  :
            CHAR szTmpPath[MAX_PATH+1];
            GetTempPath(MAX_PATH, szTmpPath);
            GetTempFileName(szTmpPath, 'GEN', 0, szTmpFile);
            hFile := CreateFile(szTmpFile, GENERIC_READ OR GENERIC_WRITE, 0, NIL, OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY, NIL);
            GOTO L1; (* Warning: no break statement *)
         END;
         break;

         …………………………….

         | WM_DESTROY :
            L1:
            IF hFile # 0 THEN
               CloseHandle(hFile);
               DeleteFile(szTmpFile);
            END;
            PostQuitMessage(0);
            (* BREAK *)
         ELSE
            WndProc := DefWindowProc(hWnd, uMsg, wParam, lParam);
            RETURN;
         END;
      END;
      WndProc := 0(*L*);
      RETURN;
   END WndProc;
   
END TmpFile.
Такую вставку можно сделать в модуль CommObxStreamsServer вместо создания окна сообщения. Программка должна создать новый временный файл и открыть его. Если файл был создан, тогда его удалить. Не суть, что в модуле используется функция(GetTempPath) поиска из системных переменных временных папок. Каталог можно указать в зависимости от задачи.

Автор:  Geniepro [ Среда, 02 Декабрь, 2009 14:23 ]
Заголовок сообщения:  Re: серверный режим через сеть

А оно компилируется в Блэкбоксе с этими метками и GOTO?
Если да, то это жестокая насмешка над Виртом со стороны Оминка...

upd. Только что попытался проверить в BB 1.5 -- не компилируется...
Код:
MODULE GotoTest;

IMPORT StdLog;

PROCEDURE Go*;
   VAR x : INTEGER;
   LABEL L1;
BEGIN
   x := 0;
   L1:   StdLog.Int(x);
         INC(x);
         GOTO L1;
END Go;

END GotoTest.

Автор:  Пётр Кушнир [ Среда, 02 Декабрь, 2009 21:07 ]
Заголовок сообщения:  Re: серверный режим через сеть

2 id_ler

ну, винапи не нужно- насколько я помню, в модуле Files присутствует функция создания временных файлов. да и вообще, вопросы конкретной реализации можно пока не рассматривать - мне лично представляется такой режим работы: запускаем загрузчик с ключом /use trunk.oberoncore.ru , загрузчик по спец протоколу загружает модули(новые или обновленные), сохраняет их в кэш, затем ядро их загружает - среда готова к работе.

Автор:  Пётр Кушнир [ Среда, 02 Декабрь, 2009 21:16 ]
Заголовок сообщения:  Re: серверный режим через сеть

поэтому понятно, то загрузчик должен минимум содержать модули по работе с файлами, сетью(прокси всё такое), протоколом проверки обновлений(версионность по дате, хэшу и тп). собственно даже кэширование необязательно, у нас же либо модули будут сохраняться на диске, либо они будут каждый раз грузиться из сети.

Автор:  id_ler [ Четверг, 03 Декабрь, 2009 08:59 ]
Заголовок сообщения:  Re: серверный режим через сеть

Пётр Кушнир писал(а):
запускаем загрузчик с ключом /use trunk.oberoncore.ru , загрузчик по спец протоколу загружает модули(новые или обновленные), сохраняет их в кэш, затем ядро их загружает - среда готова к работе.
Вы пишете как загрузиться и начать работу. Я же акцентировался на том, чем удобнее пользоваться при окончании работы и очистке среды. Как говорится в документации к модулю Files
Цитата:
Temp создает временный файл. Такой файл никогда не регистрируется и потому остается анонимным.
Кроме этого, надо как-то вести лог подключений. При использовании GetTempFileName сам список файлов может содержать дату и время.
Пётр Кушнир писал(а):
да и вообще, вопросы конкретной реализации можно пока не рассматривать
Полностью согласен с тем, что важнее разработать концепцию.

Автор:  id_ler [ Суббота, 05 Декабрь, 2009 11:46 ]
Заголовок сообщения:  Re: серверный режим через сеть

Попытаюсь применить парадигму «Всё есть документ» для обмена данными между ВВ-клиентом и ВВ-сервером через сеть. Извиняюсь за объяснение «на пальцах». У меня с терминологией туго.

Когда ВВ-клиент делает запрос ВВ-серверу для установления соединения, он передает данные, которые заполняют поля в документе на сервере. В дальнейшем данные из этого документа сортируются ВВ-сервером по специальному шаблону. Полями этого шаблона могут быть пароль, логин, тип крипто-ключа, само тело сообщения-запроса и т.д. Документ на сервере периодически обновляется. Период обновления зависит от сети (локальная или глобальная). Если передаваемые на сервер данные превышают объем, определенный в шаблоне, тогда сервер может разорвать такое соединение, не дожидаясь окончания сессии. Чтобы получить несанкционированный доступ к информации в документе ВВ-сервера нужно получить доступ к самому файлу, содержащему этот документ и, как минимум, скопировать его в буфер обмена. При этом потеряется структура документа и, в сочетании с постоянным обновлением, такие действия не позволят восстановить информацию. Подобный документ создается и на стороне ВВ-клиента. Поэтому отпадает необходимость в высокоуровневом протоколе обмена данными – и ВВ-клиент, и ВВ-сервер смогут гибко менять передаваемую информацию в зависимости от запросов.

Автор:  Info21 [ Суббота, 05 Декабрь, 2009 15:19 ]
Заголовок сообщения:  Re: серверный режим через сеть

id_ler писал(а):
Попытаюсь применить парадигму «Всё есть документ» для обмена данными между ВВ-клиентом и ВВ-сервером через сеть.
Может быть, лучше будет "Всё есть Stores.Store"?

Автор:  id_ler [ Суббота, 05 Декабрь, 2009 16:47 ]
Заголовок сообщения:  Re: серверный режим через сеть

Я исхожу из того, что для сети должен быть лаконичный интерфейс. Он не препятствует расширяемости системы, а является скорее щитом, за которым эта расширяемость может быть какой-угодно.

Автор:  Info21 [ Суббота, 05 Декабрь, 2009 21:18 ]
Заголовок сообщения:  Re: серверный режим через сеть

Так Store лаконичней, чем Document.

Автор:  id_ler [ Воскресенье, 06 Декабрь, 2009 06:49 ]
Заголовок сообщения:  Re: серверный режим через сеть

Store для сети будет слишком низкоуровневым интерфейсом. Если предоставить возможность бесконтрольно расширять систему(т.е. типы данных), в такой системе появится много лишнего. Хотя, зависит от задачи. Если, например, в локальной сети необходимо привлечь машину клиента для совместных вычислений, т.е. расширить сервер, тогда мной описанный вариант окажется не эффективным.

Автор:  Info21 [ Воскресенье, 06 Декабрь, 2009 14:32 ]
Заголовок сообщения:  Re: серверный режим через сеть

id_ler писал(а):
Store для сети будет слишком низкоуровневым интерфейсом. Если предоставить возможность бесконтрольно расширять систему (т.е. типы данных), в такой системе появится много лишнего.
Документы-то составные. В них черте-что может быть запихнуто.

Тогда всё-таки Store выглядит в силу своей обобщённости более привлекательным.

Автор:  id_ler [ Воскресенье, 06 Декабрь, 2009 21:28 ]
Заголовок сообщения:  Re: серверный режим через сеть

Если представить ситуацию, когда созданы десятки и сотни подключений, то мне не понятно, что произойдет. Предположу, что вся нагрузка ляжет на компилятор. Как минимум, нужно разделить по времени обработку каждого соединения. Насколько это замедлит процесс? Если замедлит существенно, тогда, как вариант, нужно написать всего один расширяемый тип специально для передачи данных по сети.

Автор:  Info21 [ Понедельник, 07 Декабрь, 2009 12:40 ]
Заголовок сообщения:  Re: серверный режим через сеть

id_ler писал(а):
тогда, как вариант, нужно написать всего один расширяемый тип специально для передачи данных по сети.
Зачем новый, когда уже есть Stores.Store.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/