本文為大家介紹了python腳本設(shè)置系統(tǒng)時(shí)間的方法,一共有兩種,其一是調(diào)用socket直接發(fā)送udp包到國(guó)家授時(shí)中心,其二是調(diào)用ntplib包。我在本地電腦ping 國(guó)家授時(shí)中心地址cn.pool.ntp.org有時(shí)出現(xiàn)丟包,然而,二者都沒有檢查udp是否丟包的機(jī)制,方法一在udp丟包后一直處于阻塞狀態(tài)無法退出,方法二雖然會(huì)提示超時(shí),但是不再做其它嘗試,比如重新發(fā)包,或者向同一個(gè)域名的不同IP地址發(fā)包。于是,嘗試在方法一的代碼基礎(chǔ)上,增加了超時(shí)機(jī)制,并且嘗試向同一個(gè)域名的不同IP地址發(fā)包。

具體修改后的完整代碼如下:
#-*- coding:utf-8 -*-import socketimport structimport timeimport win32apiimport osimport redef getTime(TimeServerAddresses): TIME_1970 = 2208988800L client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client.settimeout(3) data = '/x1b' + 47 * '/0' #TimeServer_ip=socket.gethostbyname('cn.pool.ntp.org') #TimeServer_ip='202.118.1.130' Port=123 for address in TimeServerAddresses: success=False count=0 while not success and count<3: print address,count try: client.sendto(data, (address, Port)) data, address = client.recvfrom(1024) success=True except socket.timeout: print 'Request timed out!' count=count+1 if success==True:a break data_result = struct.unpack('!12I', data)[10] data_result -= TIME_1970 return data_resultdef setSystemTime(now_time): tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst = time.gmtime(now_time) win32api.SetSystemTime(tm_year, tm_mon, tm_wday, tm_mday, tm_hour, tm_min, tm_sec, 0) print "Set System OK!"def getServerIP(): res1=os.popen('nslookup cn.pool.ntp.org') result1=res1.read() addresses=result1.split('/n/n')[1].split('/n')[1][12:].split(',') return addresses #for address in addresses: # res=os.popen('ping -n 2 '+address) # result=res.read() # received_num=int(re.findall('Received = [0-9]',result)[0].split('=')[1]) # if received_num > 1: # break #TimeServer=addressif __name__ == '__main__': addresses=getServerIP() now_time=getTime(addresses) setSystemTime(now_time) print "%d-%d-%d %d:%d:%d" % time.localtime(now_time)[:6]以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
新聞熱點(diǎn)
疑難解答
圖片精選