IPConnection.Listen

From SunFlurry wiki
Revision as of 08:51, 7 February 2021 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  Listen (Серверные соединения)
Объект:Объект IP
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку, число, системная ошибка
Визуальность:Нет

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

Синтаксис

IPConnection.Listen(<Порт сокета (INT)>,<Функция глобального модуля, вызываемая при установке соединения (STRING)>,<Тип соединения (INT)>=0):<Объект сервера (IPOBJECT)>

Аргументы

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

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

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

Примеры

//Пример серверной части обмена.

  Function OnIPConnection(TCP) Export
    Try
      Message("Сигнал от: "+TCP.PeerAddress);
      If not TCP.HTTPReceiveHeader Then
        Message("HTTPReceiveHeader error","!");
        exit;
      EndIf;
      //Отсылаем назад принятый заголовок без изменения
      If not TCP.HTTPSend Then
        Message("HTTPSend error","!");
        exit;
      EndIf;
      Message("Успешный обмен!");
    Except
      Message(PopError(),"!");
    EndTry;
  EndFunction

аСервер:=IPConnection.Listen(8000,"OnIPConnection");
//Вечный цикл, во время которого можно выполнять другие действия (к примеру, сервер консоли), в данном случае, мы ожидаем новые соединения.
While 1 Do
  Sleep(100);
EndDo;


//Пример клиентской части обмена (для загрузки любой web страницы), должен вернуть и вывести на экран отсылаемый пакет.

  Function LoadPage(URL)
    bHTTPs:=pos("https://",Lowercase(URL));
    If pos("//",URL)>0 Then
      tearStr(URL,"//");
    EndIf;
    СтрДоб:=URL;    
    URL:=tearStr(СтрДоб,"/");
    //URL может содержать название параграфа
    СтрДоб:=TearStr(СтрДоб,"#");
    For i:=1 to 3 Do
      if bHTTPs Then
        tcp:=IPConnection.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=443"),1);
      Else
        tcp:=IPConnection.Connect(URL+?(Pos(":",URL)+Pos("=",URL)=0,"=80"));
      EndIf;  
      if tcp.IsConnected Then
        Break;
      EndIf;
    EndDo;
    if not tcp.IsConnected Then
      Message("Could not connect: "+URL,"!");
      Exit;
    EndIf;
    СтрДоб:="/"+СтрДоб;
    if bHTTPs then
      //tcp.InitEncryption("LibreSSL","C:\LibreSSL255\libtls-15.dll");
      tcp.InitEncryption("OpenSSL","C:\OpenSSL111e\libssl-1_1.dll");
    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");
    Стр:="";
    Try
      If tcp.HTTPSendAndReceive Then
        Стр:=tcp.HTTPBodyAsString;
        If _And(Pos(_NEWLINE,Стр)=0,Pos(Chr(10),Стр)>0) Then
          Стр:=Replace(Стр,Chr(10),_NEWLINE);
        EndIf;
      EndIf;
    Except
      Message("Could not load: "+URL,"!");
    EndTry;  
    Exit Стр;
  EndFunction

s:=LoadPage("http://127.0.0.1:8000");
Message(s);