OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Понедельник, 16 Июнь, 2025 17:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Работа с сетью
СообщениеДобавлено: Вторник, 13 Февраль, 2007 20:04 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Никто не встречал ничего готового по работе с сетью?
Что-то я поискал - не нашёл. Может плохо искал? Ткните носом, плииз!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 13 Февраль, 2007 21:22 

Зарегистрирован: Среда, 07 Февраль, 2007 21:34
Сообщения: 3
Откуда: Нижний Новгород
Смотрим подсистему Comm
CommTCP
Драйвер для CommStreams.
Он реализует каналы TCP/IP, используя механизм сокетов операционной системы.
Примеры
CommObxStreamsClient
CommObxStreamsServer


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с сетью
СообщениеДобавлено: Среда, 14 Февраль, 2007 11:41 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
sacred писал(а):
Никто не встречал ничего готового по работе с сетью?
Что-то я поискал - не нашёл. Может плохо искал? Ткните носом, плииз!

CommTCP, как было верно замечено выше. Но этот модуль обладает одним неприятным недостатком: асинхронность сокетов работает только после установки соединения. Другими словами, если удаленный сервер не доступен, BlackBox будет подвисать на то время, пока пытается связаться. Поэтому однозначный маст хэв здесь:
http://espc22.murdoch.edu.au/~stewart/blackbox/
Там есть модуль CommTCPAsync, при использовании которого в качестве драйвера указанного зависания нет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с сетью
СообщениеДобавлено: Четверг, 15 Февраль, 2007 11:48 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Александр Ильин писал(а):
Поэтому однозначный маст хэв здесь:
http://espc22.murdoch.edu.au/~stewart/blackbox/
Там есть модуль CommTCPAsync, при использовании которого в качестве драйвера указанного зависания нет.

Спасибо большое, буду разбираться. А, кстати, чего-нибудь ещё более высокоуровнего нет? Типа реализаций каких-нибудь HTTP, FTP - протоколов и т.д.?

P.S. Проверил. Ссылочка не работает. Нет ли скачанного модуля?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с сетью
СообщениеДобавлено: Четверг, 22 Февраль, 2007 00:33 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Как уже говорил, ссылка не работает. Киньте кто-нибудь в меня асинхронным модулем, пожалуйста!

Между тем, попробовал использовать стандартный модуль. Вот что вышло:

Код:

MODULE ProbaTest;
IMPORT CommStreams, Log;

PROCEDURE Test*;
VAR
   s : CommStreams.Stream;
   res : INTEGER;
BEGIN (*  ya.ru - 87.250.251.8 *)
   CommStreams.NewStream("CommTCP", "", "ya.ru", s, res);
   CASE res OF
   CommStreams.done:Log.String("done")
   |CommStreams.noSuchProtocol:Log.String("noSuchProtocol")
   |CommStreams.networkDown:Log.String("networkDown")
   |CommStreams.invalidLocalAdr:Log.String("invalidLocalAdr")
   |CommStreams.localAdrInUse:Log.String("localAdrInUse")
   |CommStreams.invalidRemoteAdr:Log.String("invalidRemoteAdr")
   |CommStreams.remoteAdrInUse:Log.String("remoteAdrInUse")
   END;
   IF s.IsConnected() THEN
      Log.String("connected");
   ELSE
      Log.String("Not connected");
   END
END Test;

END ProbaTest.


Пишет : "done", а потом "Not connected". Соответственно, уже процедура ReadBytes - тоже не работает. В чём ошибка, никто не знает?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 22 Февраль, 2007 02:16 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Действительно, ссылка не работает. Выложил сюда.

По поводу ProbaTest: надо в строке адреса указать порт, к которому вы присоединяетесь. Например "ya.ru:80". Число десятичное. По умолчанию считается = 0, поэтому и не работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 25 Февраль, 2007 00:55 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Спасибо за модуль.
Что-то у меня всё равно не получается.
Код:
MODULE ProbaTest;
IMPORT CommStreams, Log, CommTCPAsync;

PROCEDURE Test*;
VAR
   s : CommStreams.Stream;
   as : CommTCPAsync.Stream;
   res : INTEGER;
BEGIN (*  ya.ru - 87.250.251.8 *)
   CommStreams.NewStream("CommTCPAsync", "", "ya.ru:80", s, res);
   IF s.IsConnected() THEN
      as := s(CommTCPAsync.Stream);
      REPEAT UNTIL as.HasConnected();
      Log.String("connected");
   ELSE
      Log.String("Not connected");
   END
END Test;

END ProbaTest.

Теперь ещё хуже. Входит в бесконечный цикл REPEAT UNTIL и всё. Такое ощущение, что вообще не может приконнектиться. При том, что ya.ru - живее всех живых... Запускал локальный web-сервер, пытался приконнектиться к localhost - та же песня.
Модуль точно рабочий?
Или я просто не умею его готовить? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 25 Февраль, 2007 01:02 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
И дубль два. Попытка прочитать что-либо стандартным модулем:
Код:
MODULE ProbaTest;
IMPORT CommStreams, Log;

PROCEDURE Test*;
VAR
   s : CommStreams.Stream;
   res, read : INTEGER;
   buff : ARRAY 100 OF BYTE;
BEGIN (*  ya.ru - 87.250.251.8 *)
   CommStreams.NewStream("CommTCP", "", "ya.ru:80", s, res);
   IF s.IsConnected() THEN
      Log.String("connected");
      s.ReadBytes(buff, 0, 100, read);
      Log.Int(read);
   ELSE
      Log.String("Not connected");
   END;

   IF s.IsConnected() THEN
      Log.String("closed");
   END;

END Test;

END ProbaTest.

Пишет соответственно: done 0 closed
Блин! 3 функции, а вызвать правильно не могу. Что-то здесь не так... Вопрос: что?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 25 Февраль, 2007 10:26 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
sacred писал(а):
Спасибо за модуль.
Что-то у меня всё равно не получается.
<...>
Теперь ещё хуже. Входит в бесконечный цикл REPEAT UNTIL и всё. Такое ощущение, что вообще не может приконнектиться. При том, что ya.ru - живее всех живых... Запускал локальный web-сервер, пытался приконнектиться к localhost - та же песня.
Модуль точно рабочий?
Или я просто не умею его готовить? :)

Модуль точно рабочий. Просто нельзя делать ожидание в таком цикле. Если бы мы были в Delphi, вам следовало бы в REPEAT - UNTIL вставить вызов Application.ProcessMessages. В BlackBox нужно воспользоваться Services.Action.

Вот пример рабочего кода. Вместо цикла я разнес открытие соединения и проверку приема в разные команды, а поток сделал глобальной переменной.
Код:
MODULE PrivProbaTest;

IMPORT CommStreams, Log;

VAR
   s : CommStreams.Stream;

PROCEDURE Test*;
VAR
   res: INTEGER;
BEGIN (*  ya.ru - 87.250.251.8 *)
   CommStreams.NewStream("CommTCPAsync", "", "ya.ru:80", s, res)
END Test;

PROCEDURE Test2*;
VAR
   read: INTEGER;
   buff: ARRAY 100 OF BYTE;
BEGIN
   IF s # NIL THEN
      IF s.IsConnected() THEN
         Log.String("connected");
         s.ReadBytes(buff, 0, 100, read);
         Log.Int(read)
      ELSE
         Log.String("closed");
      END
   ELSE
      Log.String("Not connected");
   END;
   Log.Ln
END Test2;

END PrivProbaTest.

^Q PrivProbaTest.Test
^Q PrivProbaTest.Test2


А вот тот же пример, но с использованием Services.Action для автоматической проверки поступления новых данных раз в 2 секунды. Добавлен импорт Services, тип Action, метод Action.Do, процедура Stop и глобальная переменная action: Action. Доработана процедура Test, устанавливающая соединение.
Код:
MODULE PrivProbaTest;

IMPORT CommStreams, Log, Services;

TYPE
   Action = POINTER TO RECORD (Services.Action) END;

VAR
   s : CommStreams.Stream;
   action: Action;

PROCEDURE Stop* ();
BEGIN
   IF action # NIL THEN
      Services.RemoveAction(action);
      action := NIL
   END
END Stop;

PROCEDURE Test*;
VAR
   res: INTEGER;
BEGIN (*  ya.ru - 87.250.251.8 *)
   Stop;
   CommStreams.NewStream("CommTCPAsync", "", "ya.ru:80", s, res);
   IF res = 0 THEN
      NEW(action);
      Services.DoLater(action, Services.now) (* выполняем как можно скорее *)
   END
END Test;

PROCEDURE Test2*;
VAR
   read: INTEGER;
   buff: ARRAY 100 OF BYTE;
BEGIN
   IF s # NIL THEN
      IF s.IsConnected() THEN
         Log.String("connected");
         s.ReadBytes(buff, 0, 100, read);
         Log.Int(read)
      ELSE
         Log.String("closed");
      END
   ELSE
      Log.String("Not connected");
   END;
   Log.Ln
END Test2;

PROCEDURE (act: Action) Do ();
BEGIN
   Test2;
   Services.DoLater(act, Services.Ticks() + 2 * Services.resolution) (* выполняем еще раз через 2 секунды *)
END Do;

END PrivProbaTest.

^Q PrivProbaTest.Test
^Q PrivProbaTest.Stop


Нижний предел периода вызова Services.Action.Do заложен в константе HostMenus.idlePeriod (по умолчанию = 50 мсек).

У меня модули называются PrivProbaTest, потому что я их поместил в подсистему Priv. Это имя подсистемы зарезервировано для "частного" использования.

PS: приведенные примеры проверены на ftp-сервисах (номер порта 21), но на http принять ничего не удалось, даже с того же ya.ru. Возможно, протокол http не предполагает стартового приветствия для подключившегося клиента. Этих тонкостей я не знаю, так как с http не работал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Воскресенье, 25 Февраль, 2007 10:29 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
sacred писал(а):
И дубль два. Попытка прочитать что-либо стандартным модулем:
<...>
Пишет соответственно: done 0 closed
Блин! 3 функции, а вызвать правильно не могу. Что-то здесь не так... Вопрос: что?

Вы все правильно вызываете. Проблема в том, что так сразу ничего принять невозможно, нужно подождать. К тому же, надо уточнить, должен ли вообще http сервер что-то передавать "просто так", без запроса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 27 Февраль, 2007 18:11 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 02:12
Сообщения: 485
Откуда: KZ
не должен


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB