2016-09-13 17 views
2

簡単なSNTPのPythonスクリプト

import socket 
import struct 
import sys 
import time 

NTP_SERVER = '0.uk.pool.ntp.org' 
TIME1970 = 2208988800L 

def sntp_client(): 
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    data = str.encode('\xlb' + 47 * '\0') 
    client.sendto(data, (NTP_SERVER, 123)) 
    data, addr = client.recvfrom(1024) 
    if data: 
     print('Response received from:', addr) 
    t = struct.unpack('!12I', data)[10] 
    t -= TIME1970 
    print('\tTime: %s' % time.ctime(t)) 

if __name__ == '__main__': 
    sntp_client() 

予想される出力:

Response received from: ('80.82.244.120', 123) 
     Time: Tue Sep 13 14:49:38 2016 

問題は、そのプログラムは、任意の出力を与えていないです。それはで密着しているようです:

data, addr = client.recvfrom(1024) 

私は誰かがこれで私を助けることを願っています。

+0

あなたのプログラムは、サーバからの応答を待っているが、それは永遠に待っているように、サーバーが応答していません。適切なデータを送信していますか?またはサーバーが稼動していますか?あなたは何を達成しようとしていますか? – Juggernaut

+0

@AminEtesamianは実際に、私は「** Pythonのネットワークプログラミングクックブック**」という本を参照しています。上のプログラムは本の例の1つです。 – Harshil

+1

サーバがダウンしているかではない、もう働く可能性があります。テストと作業の目的で独自のサーバーを実行できます。 – Juggernaut

答えて

0

第2版の作業スクリプトPython Network Programming Cookbookの:

import socket, struct, sys, time 

NTP_SERVER = '0.uk.pool.ntp.org' 
TIME1970 = 2208988800 

def sntp_client(): 
    client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    data = '\x1b' + 47 * '\0' 
    client.sendto(data.encode('utf-8'), (NTP_SERVER, 123)) 
    data, address = client.recvfrom(1024) 
    if data: print('Response received from:', address) 
    t = struct.unpack('!12I', data)[10] - TIME1970 
    print('\tTime = %s' % time.ctime(t)) 

if __name__ == '__main__': 
    sntp_client() 
1

が書かれたスクリプトは何も問題はありませんが、サーバーが、ファイアウォールの設定など、あなたに応答していないかもしれないもう一つの理由のために調べる必要があります。 私自身のpython SNTPスクリプトはほとんど同じです:

#!/bin/env python 

import socket 
import struct 
import sys 
import time 

TIME1970 = 2208988800L  # Thanks to F.Lundh 

pow2_31 = pow(2,31) 
pow2_32 = pow(2,32) 
pow2_16 = pow(2,16) 

if len(sys.argv) < 2: 
    sys.stderr.write("Usage : " + sys.argv[0] + " <SNTP server>") 
    exit(1) 

server = sys.argv[1] 

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
data = '\x1b' + 47 * '\0' 
time_start = time.time() 
try: 
    client.sendto(data, (server, 123)) 
    client.settimeout(2) 
except: 
    print "server <%s> not recognized" % (server) 
    exit(2) 
try: 
    data, address = client.recvfrom(1024) 
except socket.timeout: 
    print "timed out" 
    exit(3) 

if data: 
    time_reply = (time.time() - time_start) * 1000 
    print 'received %d bytes from %s in %d ms :' % (len(data), address, time_reply) 
    upacket = struct.unpack('!48B', data) 
    print upacket 

用法: $ ./sntp_client.py 0.uk.pool.ntp.org

は('83から48のバイトを受け.170.75.28 (28、3、3、236、0、0、1、171、0、0、3、0、20、139、208、232、219、177、86、148、:154ミリ秒」、123) 230、192、1、15、0、0、0、0、0、0、0、0、219、177、88、27、60、214、85、212、219、177、88、27、60、 238、157、39)

関連する問題