<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876797</guid>
        <pubDate>Fri, 23 Sep 2022 17:09:55 +0000</pubDate>
        <title>IdSNTPClient странная работа</title>
        <link>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876797</link>
        <description><![CDATA[Prince: Кажется, он вылечился. Перед вызовом datetime устанавливаю IdSNTP.Active := true, а после сбрасываю. Таким образом, сокет инициализируется при каждом вызове datetime где-то там внутри. Так вроде работает. Тогда и создание TIdSNTP в рантайме будет иметь такой же эффект, по идее.<br>Увеличил таймаут  по приему до 2000 мс, теперь и первый вызов отрабатывает как будто нормально. Будем посмотреть.<br><br>Да, глюк пропал. А таймаут лучше увеличить секунд до 5.]]></description>
        <author>Prince</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876795</guid>
        <pubDate>Fri, 23 Sep 2022 16:48:03 +0000</pubDate>
        <title>IdSNTPClient странная работа</title>
        <link>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876795</link>
        <description><![CDATA[macomics: В локальных переменных объявите еще один SBuffer, обнулите его и используйте для отправки через SendBuffer. А для ReceiveBuffer оставьте этот LBuffer. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-09-23T16:50:30+00:00">23.09.22, 16:50</time></span></span><br>
У меня просто нету под рукой сейчас этого класса в Lazarus. Я бы сам проверил в чем дело.]]></description>
        <author>macomics</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876794</guid>
        <pubDate>Fri, 23 Sep 2022 16:41:23 +0000</pubDate>
        <title>IdSNTPClient странная работа</title>
        <link>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876794</link>
        <description><![CDATA[Prince: Это не размер, а индекс в буфере пакета по логике.<br>
Не понял про локальный буфер.<br>
Попробую просто обнулить буфер перед вызовом ReciveBuffer. Хотя в случае глюка тогда я скорее всего буду получать ошибку datetime. <br>
Сейчас попробую. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2022-09-23T16:46:16+00:00">23.09.22, 16:46</time></span></span><br>
Обнуление ничего не даёт. Глюк где-то в недрах родительских классов. Точнее, даёт, глюк стал появляться чаще.]]></description>
        <author>Prince</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876786</guid>
        <pubDate>Fri, 23 Sep 2022 16:04:37 +0000</pubDate>
        <title>IdSNTPClient странная работа</title>
        <link>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876786</link>
        <description><![CDATA[macomics: Тогда попробуйте в этот метод добавить дополнительный локальный буфер, в который скопируете значения исходные, а получение уже может сработать на сохраняемом глобальном LBuffer предварительно обнуленном.<br>
<br>
И еще: А ничего, что длина у этих объектов разная?<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&nbsp;&nbsp;CopyTIdUInt32(GStack.HostToNetwork(LNTPDataGram.Xmit1), LBuffer, 40);</div><div class="code_line">&nbsp;&nbsp;CopyTIdUInt32(GStack.HostToNetwork(LNTPDataGram.Xmit2), LBuffer, 44);</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>macomics</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876784</guid>
        <pubDate>Fri, 23 Sep 2022 15:45:55 +0000</pubDate>
        <title>IdSNTPClient странная работа</title>
        <link>https://forum.sources.ru/index.php?showtopic=429987&amp;view=findpost&amp;p=3876784</link>
        <description><![CDATA[Prince: Мир вам. Подскажите, может кто сталкивался.<br>
На форму кидаю TidSNTP и таймер.<br>
Устанавливаю свойства:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">idsntp.Host &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; := &#39;192.168.0.73&#39;;</div><div class="code_line">idsntp.Port &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; := 1234;</div><div class="code_line">idsntp.ReciveTimeout &nbsp;:= 500; //1000;</div></ol></div></div></div></div> <br>
Таймер срабатывает с периодом в 10 секунд.<br>
В обработчике таймера происходит следующее:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if idsntp.datetime &#60;&#62; 0 then</div><div class="code_line">&nbsp;begin</div><div class="code_line">//caption := inttostr(idsntp.sendtime) + &#39; &#39;+inttostr(idsntp.rectime);</div><div class="code_line">&nbsp;&nbsp;statuslabel.Caption &nbsp; &nbsp; &nbsp; &nbsp;:= &#39;Ok&#39;;</div><div class="code_line">&nbsp;&nbsp;rounddelaylabel.Caption &nbsp; &nbsp;:= inttostr(round (idsntp.RoundTripDelay * 24 * 3600 * 1000)) + &#39; ms&#39;;</div><div class="code_line">&nbsp;&nbsp;adjustingtimelabel.Caption := inttostr(round (idsntp.AdjustmentTime * 24 * 3600 * 1000)) + &#39; ms&#39;;</div></ol></div></div></div></div><br>
Так вот, как правило, idsntp.datetime отрабатывает корректно и тогда значения RoundTripDelay лежат в интервале 4..300 мс.<br>
Но иногда/периодически возникает странная ситуация: idsntp.datetime отрабатывает вроде бы штатно, но RoundTripDelay составляет секунды, до 10 и более, и примерно на столько же увеличивается и AdjustmentTime. Обычно начинается с того, что первый при запуске программы вызов datetime отрабатывает с ошибкой(почему-то), а вслед за этим начинает возвращать некорректные значения RoundTripDelay и AdjustmentTime. Но такая ситуация иногда возникает и в процессе...<br>
И если datetime начинает выдавать неправильные значения, то так и продолжает. До перезапуска программы(как будто). Но иногда начинает работать как положено.<br>
Такой вот нестабильный глюк.<br>
Залез в компонент TidSNTPClient.<br>
Привожу часть метода datetime:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Begin</div><div class="code_line">Result := 0.0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SetLength(LBuffer, SizeOf(TNTPGram));</div><div class="code_line">&nbsp;&nbsp;FillBytes(LBuffer, SizeOf(TNTPGram), {text});</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;LBuffer[0] := B;</div><div class="code_line">&nbsp;&nbsp;DateTimeToNTP(Now, LNTPDataGram.Xmit1, LNTPDataGram.Xmit2);</div><div class="code_line">&nbsp;&nbsp;CopyTIdUInt32(GStack.HostToNetwork(LNTPDataGram.Xmit1), LBuffer, 40);</div><div class="code_line">&nbsp;&nbsp;CopyTIdUInt32(GStack.HostToNetwork(LNTPDataGram.Xmit2), LBuffer, 44);</div><div class="code_line">&nbsp;&nbsp;//sendtime:=gettickcount;</div><div class="code_line">&nbsp;&nbsp;SendBuffer(LBuffer);</div><div class="code_line">&nbsp;&nbsp;//sendtime:=gettickcount-sendtime;</div><div class="code_line">&nbsp;&nbsp;//rectime:=gettickcount;</div><div class="code_line">&nbsp;&nbsp;ReceiveBuffer(LBuffer);</div><div class="code_line">&nbsp;&nbsp;//rectime:=gettickcount-rectime;</div><div class="code_line">&nbsp;</div><div class="code_line">// ...</div><div class="code_line">&nbsp;</div><div class="code_line">// corrected as per RFC 2030 errata</div><div class="code_line">&nbsp;&nbsp; &nbsp;FRoundTripDelay := (FDestinationTimestamp - FOriginateTimestamp) -</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;(FTransmitTimestamp - FReceiveTimestamp);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FLocalClockOffset := ((FReceiveTimestamp - FOriginateTimestamp) +</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;(FTransmitTimestamp - FDestinationTimestamp)) / 2;</div></ol></div></div></div></div><br>
Выяснил, что в случае правильной работы компонента, метод SendBuffer отрабатывает &quot;мгновенно&quot;, а ReciveBuffer в течении 20..300 мс и фактически RoundTripDelay - это &quot;время срабатывания&quot; ReciveBuffer. Когда происходит глюк, вижу что ReciveBuffer начинает отрабатывать так же &quot;мгновенно&quot;, как и SendBuffer. Ощущение, что где-то в приемном буфере остаётся мусор от предыдущего вызова ReciveBuffer и именно этот &quot;хвост&quot; ReciveBuffer читает. Но при этом возвращает ненулевое (и корректное) значение времени, то есть прочитанный пакет NTP проходит все проверки. :scratch:  <br>
Uлюк происходит где-то в недрах родительского класса. Что это и как от него избавиться. :-? <br>
<br>
Я пока не пробовал создавать и уничтожать экземпляр TidSNTP в рантайме.  Может быть это исправит ситуацию, но я хочу понять. Может, я что-то не так делаю.]]></description>
        <author>Prince</author>
        <category>Delphi: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	