IPConnection.ListenEx

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

Функция создает TCP/IP сервер на указанном порту. Для получения новых соединений необходимо использовать функцию Accept в цикле ожидания, для которого удобно использовать особую функцию простоя Wait. Вызов Disconnect или удаление объекта из системы автоматически закрывает сервер и освобождает порт. Такой линейный подход удобно использовать, если необходимо добавить защиту от атак, так как получение входящего соединения и проверка адреса удаленной стороны в черном списке очень дешевая процедура, после которой можно сразу разорвать связь, если клиент находится в черном списке. При использовании стандартной функции Listen, всегда используется корневой поток и нагрузка на систему при принятии соединения в целом несколько выше.

Синтаксис

IPConnection.ListenEx(<Порт сокета (INT)>,<Тип соединения (INT)>=0):<Объект сервера (IPOBJECT)>

Аргументы

  • <Порт сокета (INT)> - Номер порта, для которого открывается серверный сокет. Номер может принимать значения от 1 до 65535. Если порт уже занят в системе (сервером или клиентом), он не может быть повторно открыт, в таком случае, функция вызовет исключение. Один и тот же порт может быть открыт одновременно для IPv4 и IPv6.
  • <Тип соединения (INT)> - (необязательный аргумент) Указывает на тип (протокол) соединения. Доступны следующие значения аргумента:
    • 0 (по умолчанию) -- Будет использован протокол IPv4
    • 1 -- Будет использован протокол IPv6

Возвращаемое значение

Возвращается новый серверный объект IP. В момент удаления этого объекта из системы, сервер будет также удален и удерживаемый порт освобожден.

Примеры

//Данный пример совмещает серверную и клиентскую часть в одном фрагменте кода.
//Серверная часть получает 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");