IPConnection.Connect

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

Функция производит соединение TCP/IP с удаленным сервером, после установки соединения никакой дополнительной информации не отсылается.

Синтаксис

IPConnection.Connect(<Адрес соединения (STRING)>,<Блокирующий ли это сокет (INT)>=0,<Тип соединения (INT)>=0):<Новое соединение (IPOBJECT)>

Аргументы

  • <Адрес соединения (STRING)> - Адрес соединения задается в виде <Доменное имя сервера, адрес IPv4 или IPv6>[:<Номер порта>] (примеры: 127.0.0.1:80, en.wikipedia.org:443, москва.рф:443, ::1=80). При указании IP адреса (xxx.xxx.xxx.xxx или xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx), можно использовать квадратные скобки [, ] для отделения IP адреса от номера порта. Номер порта можно указывать после знака : или знака =, для IPv6 адресов можно использовать только знак = или использовать квадратные скобки, как разделитель, так как : занят для указания элементов адреса (примеры: 127.0.0.1=80, [::1]:443). Если номер порта в адресе не задан, используется порт 80. Доменное имя будет автоматически закодировано в формат Punycode, если в нем присутствуют международные символы, однако, нужно помнить, что при формировании http заголовка поле Host необходимо также кодировать с помощью Punycode (см. пример ниже).
  • <Блокирующий ли это сокет (INT)> - (необязательный аргумент) Указание на то, будет ли созданное соединение блокирующим. Блокирующие соединения не имеют доступа к ряду функций (к примеру Receive или Peek). По умолчанию, используется не блокирующее соединение.
  • <Тип соединения (INT)> - (необязательный аргумент) Указывает на тип (протокол) соединения. Нужно заметить, что если аргумент адрес соединения использует нотацию IPv6 или доменное имя возвратит только IPv6 адрес (у сервера отсутствует IPv4 адрес), значение этого аргумента будет проигнорировано и будет использован протокол IPv6, и наоборот, если тип соединения подразумевает IPv6, однако можно осуществить соединение только на IPv4, аргумент будет проигнорирован. Чтобы узнать, по какому протоколу осуществлено соединение, можно использовать атрибут IsIPv6. Доступны следующие значения аргумента:
    • 0 (по умолчанию) -- Будет использован протокол IPv4
    • 1 -- Будет использован протокол IPv6

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

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

Примеры

//Пример показывает, как можно осуществить загрузку веб-страницы по ее адресу.
//Для загрузки по протоколу https требуется указание пути к библиотекам OpenSSL или LibreSSL.

  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("https://en.wikipedia.org/wiki/Main_Page");
Message(s);