IPConnection.Wait

From SunFlurry wiki
Jump to: navigation, search
  Wait (Серверные соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в число, системная ошибка
Визуальность:Нет

TCP/IP функция работающая с установленным соединением, выполняет ожидание возникновения события в течение заданного времени, и возвращается в момент возникновения события, либо по истечении времени ожидания. Функция используется для исключения паузы между возникновением события и его обработкой, которая возникла бы при использовании функции Sleep. Доступны следующие события: событие, возникающее в момент поступления новых данных в буфер операционной системы (обычно совместно с функцией Receive), событие, возникающее после того, как были отправлены данные из буфера операционной системы, и он готов принять новые данные (обычно совместно с функцией Send), событие, возникающее в момент, когда в очередь соединений поступило по крайней мере одно новое удаленное соединение (обычно совместно с функциями ListenEx и Accept).

Синтаксис

IPConnection.Wait(<Время ожидания готовности в мс. (INT)>,<Тип события для ожидания (INT)>=1)

Аргументы

  • <Время ожидания готовности в мс. (INT)> - Аргумент задает время в миллисекундах, которое может быть потрачено функцией на ожидание требуемого события IP. Функция возвратит управление либо по истечении времени ожидания, либо в момент возникновения события. Указание менее 10 мс. имеет мало смысла, так как цикл работы с вызовом функции Wait также будет занимать время и это время будет сравнимо с указанными 10 мс.
  • <Тип события для ожидания (INT)> - (необязательный аргумент) Указывает на тип (типы) ожидаемого события. Является битовой маской для указания типов событий. Не рекомендуется, однако, указывать событие accept совместно с событиями read и write, некоторые версии Windows могут не совсем корректно обрабатывать такие комбинации. Заданы следующие значения битов:
    • бит 1 (по умолчанию) -- Событие read, возникающее в момент поступления новых данных в буфер операционной системы.
    • бит 2 -- Событие write, возникающее после того, как были отправлены данные из буфера операционной системы, и он готов принять новые данные.
    • бит 3 -- Событие accept, возникающее в момент, когда в очередь соединений поступило по крайней мере одно новое удаленное соединение. Важно понимать, что если в очереди находится более одного соединения, после извлечения из очереди первого и повторения цикла ожидания, он не вернет управление сразу, так как событие для второго соединения уже было создано, поэтому после получения соединения необходимо повторить попытку получения до тех пор, пока новые соединения появляются и только после этого перейти к ожиданию.

Примеры

//Данный пример совмещает серверную и клиентскую часть в одном фрагменте кода.
//Серверная часть получает http запрос и отдает его, добавляя одно поле, после чего клиентская часть получает пакет и выводит его в лог

аСервер:=IPConnection.ListenEx(8000);
URL:="http://127.0.0.1:8000";


//Инициализация и отсылка пакета
If pos("//",URL)>0 Then
  tearStr(URL,"//");
EndIf;
СтрДоб:=URL;    
URL:=tearStr(СтрДоб,"/");
tcp:=IPConnection.Connect(URL);
if not tcp.IsConnected Then
  Message("Ошибка соединения с сервером!","!");
  Exit;
EndIf;
СтрДоб:="/"+СтрДоб;
tcp.HTTPSetOperation("GET "+СтрДоб+" HTTP/1.0");
tcp.HTTPSetHeaderField("Host",tcp.HTTPPunycodeEncode(URL));
tcp.HTTPSetHeaderField("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
tcp.HTTPSetHeaderField("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
tcp.HTTPSetHeaderField("Accept-Language","en");
tcp.HTTPSetHeaderField("Connection","Close");
If not tcp.HTTPSend Then
  Message("Ошибка отправки запроса клиентом!","!");
  exit;
EndIf;
Message("Клиент отослал запрос: "+_NEWLINE+tcp.HTTPHeaderAsString);
//Очистим заголовок, чтобы убедиться, что он придет назад с сервера
tcp.HTTPClear();

//Ожидание пакета на сервере
While 1 Do
  аСервер.Wait(10,4);
  аКлиент:=аСервер.Accept();
  If not isEmpty(аКлиент) Then
    Break;      
  EndIf;
EndDo;

Message("Сигнал от: "+аКлиент.PeerAddress,"I");
If not аКлиент.HTTPReceiveHeader Then
  Message("Ошибка получения запроса сервером!","!");
  exit;
EndIf;
//Добавим к принятому заголовку дополнительное поле
аКлиент.HTTPSetHeaderField("Hello","World");
//Отсылаем назад принятый заголовок
If not аКлиент.HTTPSend Then
  Message("Ошибка отправки ответа сервером!","!");
  exit;
EndIf;
Message("Успешный обмен (сервер)!","I");

аКлиент.Disconnect();

//Получение ответа клиентом
If not tcp.HTTPReceive Then
  Message("Ошибка получения ответа клиентом!","!");
  exit;
EndIf;
Message("Клиент получил ответ: "+_NEWLINE+tcp.HTTPHeaderAsString);
Message("Успешный обмен (клиент)!","I");