python有超时的windows系统时间设置代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python有超时的windows系统时间设置代码相关的知识,希望对你有一定的参考价值。

   手边的笔记本用久了,cmos电池可能又没电了。每次开机时间都不对,导致访问一些有https的网页会出现警告信息。

   于是找了找通过python脚本设置系统时间的方法,发现了两种,其一是调用socket直接发送udp包到国家授时中心,其二是调用ntplib包。我在本地电脑ping 国家授时中心地址cn.pool.ntp.org有时出现丢包,然而,二者都没有检查udp是否丢包的机制,方法一在udp丢包后一直处于阻塞状态无法退出,方法二虽然会提示超时,但是不再做其它尝试,比如重新发包,或者向同一个域名的不同IP地址发包。于是,尝试在方法一的代码基础上,增加了超时机制,并且尝试向同一个域名的不同IP地址发包。

技术分享

具体修改后的完整代码如下:

#-*- coding:utf-8 -*-

import socket
import struct
import time
import win32api
import os
import re


def 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_result

def 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=address


if __name__ == __main__:
    addresses=getServerIP()
    now_time=getTime(addresses)
    setSystemTime(now_time)
    print "%d-%d-%d %d:%d:%d" % time.localtime(now_time)[:6]

参考:

[1]方法一:使用Python设置系统时间(给系统校时) - 网海水手 - 博客频道 - CSDN.NET

[2]方法二:python第三方库推荐 - 通过ntplib在windows上同步时间 - mattkang - 博客频道 - CSDN.NET

[3]ntplib源码:https://pypi.python.org/pypi/ntplib/

[4]socket 设置超时:attributes - Python Socket timeout error - Stack Overflow

[5]Python Socket API 笔记 - my2010Sam的专栏 - 博客频道 - CSDN.NET

[6]python执行系统命令的方法 :os.system(),subprocess.popen(),commands - 白杨的日志 - 网易博客

[7]windows安装python:http://my.oschina.net/bailiangcn/blog/288538#OSC_h2_2

[8]国家授时中心 IP 210.72.145.44 不可用了吗? - 开源中国社区

以上是关于python有超时的windows系统时间设置代码的主要内容,如果未能解决你的问题,请参考以下文章

Python通过win32com运行MessageQueue.Peek,如何正确设置超时时间?

python使用session接口依然报登录超时

pycharm远程连接超时

python websockets,如何设置连接超时

Python设置函数调用超时

如何设置线程超时? [复制]