{"id":2085,"date":"2024-03-28T12:50:40","date_gmt":"2024-03-28T11:50:40","guid":{"rendered":"https:\/\/alessandromasciadri.com\/?p=2085"},"modified":"2024-03-28T12:57:02","modified_gmt":"2024-03-28T11:57:02","slug":"come-realizzare-un-client-ntp-in-python","status":"publish","type":"post","link":"https:\/\/alessandromasciadri.com\/come-realizzare-un-client-ntp-in-python\/","title":{"rendered":"Come realizzare un client NTP in Python"},"content":{"rendered":"\t\t<div data-akihiro-type=\"ama-post\" data-akihiro-id=\"2085\" class=\"akihiro akihiro-2085\" data-akihiro-post-type=\"post\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ff88090 e-flex e-con-boxed e-con e-parent\" data-id=\"ff88090\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"akihiro-element akihiro-element-49d8ecc akihiro-widget akihiro-widget-text-editor\" data-id=\"49d8ecc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In questo post vediamo come realizzare, utilizzando poche righe di codice, uno script Python che agisca da client NTP.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-b1c5a52 akihiro-widget akihiro-widget-heading\" data-id=\"b1c5a52\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Soluzione 1<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ad35240 akihiro-widget akihiro-widget-text-editor\" data-id=\"ad35240\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>In questa prima soluzione ci avvaliamo semplicemente di un socket per inviare una query al server NTP.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-cc2c56e akihiro-widget akihiro-widget-code-highlight\" data-id=\"cc2c56e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>#!\/usr\/bin\/env python\nfrom contextlib import closing\nfrom socket import socket, AF_INET, SOCK_DGRAM\nimport struct\nimport time\n   \nNTP_PACKET_FORMAT = \"!12I\"\nNTP_DELTA = 2208988800  # 1970-01-01 00:00:00\nNTP_QUERY = b'\\x1b' + 47 * b'\\0'  \n    \ndef ntp_time(host=\"pool.ntp.org\", port=123):\n    with closing(socket( AF_INET, SOCK_DGRAM)) as s:\n        s.settimeout(5)\n        s.sendto(NTP_QUERY, (host, port))\n        msg, address = s.recvfrom(1024)\n    unpacked = struct.unpack(NTP_PACKET_FORMAT,\n                   msg[0:struct.calcsize(NTP_PACKET_FORMAT)])\n    return unpacked[10] + float(unpacked[11]) \/ 2**32 - NTP_DELTA\n\n\nif __name__ == \"__main__\":\n    print(time.ctime(ntp_time()))<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-6df009e akihiro-widget akihiro-widget-heading\" data-id=\"6df009e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t<h3 class=\"akihiro-heading-title akihiro-size-default\">Soluzione 2<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-ad2c266 akihiro-widget akihiro-widget-text-editor\" data-id=\"ad2c266\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Come soluzione alternativa, se non vogliamo gestire direttamente il socket per comunicare con il server NTP, possiamo utilizzare <a href=\"https:\/\/pypi.org\/project\/ntplib\/\">ntplib<\/a>. In questo caso il codice risulterebbe il seguente:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"akihiro-element akihiro-element-10987c1 akihiro-widget akihiro-widget-code-highlight\" data-id=\"10987c1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"code-highlight.default\">\n\t\t\t\t<div class=\"akihiro-widget-container\">\n\t\t\t\t\t\t\t<div class=\"prismjs-okaidia copy-to-clipboard \">\n\t\t\t<pre data-line=\"\" class=\"highlight-height language-python line-numbers\">\n\t\t\t\t<code readonly=\"true\" class=\"language-python\">\n\t\t\t\t\t<xmp>import ntplib\nfrom time import ctime\nc = ntplib.NTPClient()\nresponse = c.request('pool.ntp.org')\nprint(ctime(response.tx_time))<\/xmp>\n\t\t\t\t<\/code>\n\t\t\t<\/pre>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>In questo post vediamo come realizzare, utilizzando poche righe di codice, uno script Python che agisca da client NTP. Soluzione 1 In questa prima soluzione ci avvaliamo semplicemente di un socket per inviare una query al server NTP. #!\/usr\/bin\/env python from contextlib import closing from socket import socket, AF_INET, SOCK_DGRAM import struct import time NTP_PACKET_FORMAT [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[2,12],"class_list":["post-2085","post","type-post","status-publish","format-standard","hentry","category-programmazione","tag-code","tag-python"],"_links":{"self":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/2085","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/comments?post=2085"}],"version-history":[{"count":4,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/2085\/revisions"}],"predecessor-version":[{"id":2089,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/posts\/2085\/revisions\/2089"}],"wp:attachment":[{"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/media?parent=2085"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/categories?post=2085"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alessandromasciadri.com\/ama-json\/wp\/v2\/tags?post=2085"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}