<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB</id>
	<title>USR1 протокол - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://sfsys.ru/index.php?action=history&amp;feed=atom&amp;title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB"/>
	<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&amp;action=history"/>
	<updated>2026-04-04T13:56:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://sfsys.ru/index.php?title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&amp;diff=3070&amp;oldid=prev</id>
		<title>Admin: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&amp;diff=3070&amp;oldid=prev"/>
		<updated>2021-02-07T06:54:54Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 06:54, 7 February 2021&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
	<entry>
		<id>http://sfsys.ru/index.php?title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&amp;diff=3069&amp;oldid=prev</id>
		<title>Admin at 11:44, 6 August 2020</title>
		<link rel="alternate" type="text/html" href="http://sfsys.ru/index.php?title=USR1_%D0%BF%D1%80%D0%BE%D1%82%D0%BE%D0%BA%D0%BE%D0%BB&amp;diff=3069&amp;oldid=prev"/>
		<updated>2020-08-06T11:44:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{HeadLinks|&lt;br /&gt;
* [[Main_Page|Начальная страница]]&lt;br /&gt;
* [[Общее_описание_языка|Общее описание]]&lt;br /&gt;
* [[Объекты]]&lt;br /&gt;
* [[Объект IP]]}}&lt;br /&gt;
&amp;lt;p&amp;gt;USR1 это простой внутрисистемный протокол, позволяющий осуществлять обмен файлами и другой информацией. Удобство его использования заключается в том, что протокол встроен в общесистемных набор протоколов общения и не требует написания части приветствия, в которую также входит обмен файлами, что делает его простым в описании и удобным для использования для несложных программ обмена.&amp;lt;/p&amp;gt;&lt;br /&gt;
Для создания сервера, работающего по данному протоколу, можно добавить дополнительный раздел текста в ini-файл клиента (консольного или визуального), либо использовать функцию '''[[IPConnection.ListenUSR1|ListenUSR1]]'''.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Раздел инициализации USR1 сервера в ini-файле клиента.&lt;br /&gt;
[TCPServer]&lt;br /&gt;
Ports=&amp;quot;13522&amp;quot;&lt;br /&gt;
Password=&amp;quot;xxxxxxxxxxx&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Протокол выделяет понятие ''команда''. Пакет с командой занимает 4 байта и содержит заранее определенное слово и 4 латинских букв. Для обмена ''командами'' можно использовать функции [[IPConnection.SendCmd|SendCmd]] и [[IPConnection.ReceiveCmd|ReceiveCmd]]. В протоколе можно использовать шифрование (как и для любого TCP соединения), однако, шифрование можно включить только после инициации приветствия, что ограничивает использование протокола для обмена конфиденциальной информацией.&lt;br /&gt;
&lt;br /&gt;
Последовательность действий при обмене по USR1 протоколу:&lt;br /&gt;
* Клиентская часть вызывает функцию '''[[IPConnection.ConnectUSR1|ConnectUSR1]]''' и получает TCP объект, с помощью которого ведется обмен.&lt;br /&gt;
* Клиентская часть использует конструкцию '''.SendCmd(&amp;quot;USR1&amp;quot;)''', для инициализации USR1 протокола после соединения с сервером.&lt;br /&gt;
* Клиентская часть получает ответ с помощью функции '''.ReceiveCmd()'''. В ответ сервер может:&lt;br /&gt;
# Разорвать соединение (USR1 не поддерживается)&lt;br /&gt;
# Отдать команду &amp;quot;BUSY&amp;quot; (сервер занят обслуживанием другого клиента или максимального количества клиентов)&lt;br /&gt;
# Отдать команду &amp;quot;OK&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot; (сервер готов к обслуживанию по USR1 протоколу)&lt;br /&gt;
* Клиентская часть использует конструкцию '''.SendStr(&amp;lt;Строка&amp;gt;)''', для пересылки любой начальной информации для сервера.&lt;br /&gt;
* При необходимости отсылки группы файлов вместе с начальной информацией, клиент для каждого из файлов последовательно отсылает команду &amp;quot;RECV&amp;quot; ('''.SendCmd(&amp;quot;RECV&amp;quot;)''') и отсылает файл с помощью '''.SendFile'''.&lt;br /&gt;
** После того, как последний файл будет отослан (либо отсылка файлов не производилась вообще), клиент отсылает команду &amp;quot;FNSH&amp;quot;.&lt;br /&gt;
* В сервеной части запускается выполнение события '''[[OnUsr1Connection]]''', которое на основании текущего состояния системы должно ответить командой &amp;quot;OK&amp;amp;nbsp;&amp;amp;nbsp;&amp;quot; (обмен инициирован), &amp;quot;BUSY&amp;quot; (север уже занят обслуживанием одного или максимального количества клиентов) или разорвать соединение.&lt;br /&gt;
* Клиентская часть получает ответ с помощью функции '''.ReceiveCmd()''' и, руководствуясь им, продолжает или заканчивает обмен.&lt;br /&gt;
* Дальнейший протокол обмена задается программно.&lt;br /&gt;
&lt;br /&gt;
== Примеры ==&lt;br /&gt;
Исходный код с примерами серверной и клиентской частей:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Исходный код примера клиентской части&lt;br /&gt;
Function ПровестиОбмен()&lt;br /&gt;
  Сокет:=IPConnection.ConnectUSR1(&amp;quot;127.0.0.1:13777&amp;quot;);//Инициация соединения&lt;br /&gt;
  If not Сокет.isConnected() Then&lt;br /&gt;
    Message(&amp;quot;Сервер не отвечает&amp;quot;,&amp;quot;!&amp;quot;);&lt;br /&gt;
    Exit 0;&lt;br /&gt;
  EndIf;&lt;br /&gt;
  СтрОшибка:=&amp;quot;&amp;quot;;&lt;br /&gt;
  Try&lt;br /&gt;
    СтрОшибка:=&amp;quot;Сервер не принял режим USR1 (1)!&amp;quot;;&lt;br /&gt;
    Сокет.SendCmd(&amp;quot;USR1&amp;quot;);&lt;br /&gt;
    Комм:=Сокет.ReceiveCmd();&lt;br /&gt;
    If Комм=&amp;quot;BUSY&amp;quot; Then&lt;br /&gt;
      Message(&amp;quot;Сервер занят!&amp;quot;,&amp;quot;!&amp;quot;);&lt;br /&gt;
      Exit 0;&lt;br /&gt;
    EndIf;&lt;br /&gt;
    If Комм&amp;lt;&amp;gt;&amp;quot;OK  &amp;quot; Then&lt;br /&gt;
      Message(&amp;quot;Сервер не принял режим USR1 (2)!&amp;quot;,&amp;quot;!&amp;quot;);&lt;br /&gt;
      Exit 0;&lt;br /&gt;
    EndIf;&lt;br /&gt;
&lt;br /&gt;
    СтрОшибка:=&amp;quot;Ошибка при обмене!&amp;quot;;&lt;br /&gt;
    Сокет.SendStr(&amp;quot;Hello, this is client!&amp;quot;);&lt;br /&gt;
    //Отсылка текстового файла C:\file.txt&lt;br /&gt;
    Сокет.SendCmd(&amp;quot;RECV&amp;quot;);&lt;br /&gt;
    Сокет.SendFile(&amp;quot;C:\file.txt&amp;quot;,1);&lt;br /&gt;
&lt;br /&gt;
    //Окончание обмена файлами&lt;br /&gt;
    Сокет.SendCmd(&amp;quot;FNSH&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Комм:=Сокет.ReceiveCmd();&lt;br /&gt;
    If Комм&amp;lt;&amp;gt;&amp;quot;OK  &amp;quot; Then&lt;br /&gt;
      Exit 0;&lt;br /&gt;
    EndIf;&lt;br /&gt;
    Стр:=&amp;quot;Любая информация для обмена&amp;quot;;&lt;br /&gt;
    Сокет.SendStr(Стр,1);&lt;br /&gt;
    Сокет.ReceiveStr(Стр,1);&lt;br /&gt;
    Message(&amp;quot;Сервер прислал информацию: &amp;quot;+Стр);&lt;br /&gt;
    //Далее следует обмен любой другой информацией&lt;br /&gt;
  Except&lt;br /&gt;
    If СтрОшибка&amp;lt;&amp;gt;&amp;quot;&amp;quot; Then&lt;br /&gt;
      Message(СтрОшибка,&amp;quot;!&amp;quot;);&lt;br /&gt;
    Else&lt;br /&gt;
      Message(PopError(),&amp;quot;!&amp;quot;);&lt;br /&gt;
    EndIf;&lt;br /&gt;
    Exit 0;&lt;br /&gt;
  EndTry&lt;br /&gt;
  Exit 1;&lt;br /&gt;
EndFunction&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
//Исходный код примера серверной части&lt;br /&gt;
Function OnUsr1Connection(Сокет,Параметр,FList)&lt;br /&gt;
  Try&lt;br /&gt;
    Message(&amp;quot;Клиент при соединении использовал параметр: &amp;quot;+Параметр);&lt;br /&gt;
    If ThreadCount()&amp;gt;1 Then&lt;br /&gt;
      //Данный сервер не будет принимать новых клиентов, пока предыдущий запрос не обработан в полной мере&lt;br /&gt;
      Сокет.SendCmd(&amp;quot;BUSY&amp;quot;);&lt;br /&gt;
      Exit;&lt;br /&gt;
    EndIf;&lt;br /&gt;
    Сокет.SendCmd(&amp;quot;OK  &amp;quot;);&lt;br /&gt;
    For i:=1 To FList.Size() Do&lt;br /&gt;
      Message(&amp;quot;Клиент прислал файл: &amp;quot;+FList.Get(i));&lt;br /&gt;
      Message(&amp;quot;  Размер файла: &amp;quot;+File.GetFileSize(FList.Get(i)));&lt;br /&gt;
    EndDo;&lt;br /&gt;
    Стр:=Сокет.ReceiveStr(Стр,1);&lt;br /&gt;
    Message(&amp;quot;Клиент прислал информацию: &amp;quot;+Стр);&lt;br /&gt;
    Стр:=&amp;quot;Ответ на любую информацию&amp;quot;;&lt;br /&gt;
    Сокет.SendStr(Стр,1);&lt;br /&gt;
    //Далее следует обмен любой другой информацией&lt;br /&gt;
  Finally&lt;br /&gt;
    //Разрываем соединение, чтобы система не ждала продолжения&lt;br /&gt;
    SuppressException();&lt;br /&gt;
    Сокет.Disconnect();&lt;br /&gt;
  EndTry;&lt;br /&gt;
EndFunction&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
		
	</entry>
</feed>