Difference between revisions of "IPConnection.Listen"
m (1 revision imported) |
|
(No difference)
|
Latest revision as of 07:51, 7 February 2021
Listen (Серверные соединения) | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Функция создает 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);