十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
窗口边框(FormBorderStyle)设为None,窗口(WindowState)设为Maximized,如果想让窗口背景透明,将窗口背景颜色和TransparencyKey设为同一种颜色,按钮用Label(标签)代替,背景设为Transparent,边框设为None,文字位置一般是下中,Label控件支持无边框。
10多年的三沙网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整三沙建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“三沙网站设计”,“三沙网站推广”以来,每个客户项目都认真落实执行。
动感效果在鼠标事件(MouseDown按下,MouseUp抬起,MouseEnter进入,MouseLeave离开)更换指定的图片;
添加timer控件还可以使用动画
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.Label1.Refresh()
End Sub
快捷键用热键
RegisterHotKey
函数功能:该函数定义一个系统范围的热键。
函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);
参数:
hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。
id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:
MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。
MOD_SHIFT:按下的可以是任一Shift键。
MOD_WIN:按下的可以是任一Windows按键。
vk:定义热键的虚拟键码。
返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。
备注:当某键被接下时,系统在所有的热键中寻找匹配者。一旦找到一个匹配的热键,系统将把WM_HOTKEY消息传递给登记了该热键的线程的消息队列。该消息被传送到队列头部,因此它将在下一轮消息循环中被移去。该函数不能将热键同其他线程创建的窗口关联起来。
若为一热键定义的击键己被其他热键所定义,则RegisterHotKey函数调用失败。
若hWnd参数标识的窗口已用与id参数定义的相同的标识符登记了一个热键,则参数fsModifiers和vk的新值将替代这些参数先前定义的值。
若设置MOD_KEYUP位,则当发生键被按下或被弹起的事件时,窗口将发送WM_HOTKEY消息。
RegisterHotKey可以被用来在线程之间登记热键。
UnregisterHotKey
函数功能:该函数释放调用线程先前登记的热键。
函数原型:BOOL UnregisterHotKey(HWND hWnd,int id);
参数:
hWnd:与被释放的热键相关的窗口句柄。若热键不与窗口相关,则该参数为NULL。
id:定义被释放的热键的标识符。
返回值:若函数调用成功,返回值不为0。若函数调用失败,返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。
1、首先定义所需要用到的常量
如图所示,在窗体代码后定义常量和API函数
代码如下:
Public Const WM_HOTKEY As Integer = H312
Public Const MOD_ALT As Integer = H1
Public Const MOD_CONTROL As Integer = H2
Public Const MOD_SHIFT As Integer = H4
Public Const GWL_WNDPROC As Integer = (-4)
Public Declare Auto Function RegisterHotKey Lib "user32.dll" Alias "RegisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer, ByVal fsModifiers As Integer, ByVal vk As Integer) As Boolean
Public Declare Auto Function UnRegisterHotKey Lib "user32.dll" Alias "UnregisterHotKey" (ByVal hwnd As IntPtr, ByVal id As Integer) As Boolean
下面过程是注册Ctrl+T的组合键为组合键,假如注册成功,则返回true,反之注册失败则返回false,我们可以根据返回的结果判断并提醒用户注册的情况。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim isResult As Boolean
isResult=RegisterHotKey(Handle, 0, MOD_CONTROL, Asc("T")) ’注册Ctrl+T的组合键
If isResult = False Then
MsgBox("注册热键Ctrl+T失败")
End If
End Sub
[apge]
下面过程为重载WndProc过程,响应热键并处理热键,这里是用来隐藏和显示程序主界面。
Protected Overrides Sub WndProc(ByRef m As Message)
If m.Msg = WM_HOTKEY Then
System.Diagnostics.Process.Start("C:\WINDOWS\system32\freecell.exe")'运行当空接龙游戏
End If
MyBase.WndProc(m)
End Sub
最后在关闭窗体的时候释放占用的热键,如果前面注册失败的话,则会出现释放失败的结果。
Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Closed
Dim isResult As Boolean
isResult=UnRegisterHotKey(Handle, 0)
End Sub
双击打开指定的程序
Private Sub Label1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Label1.DoubleClick
System.Diagnostics.Process.Start("C:\WINDOWS\system32\freecell.exe")
End Sub
System.Diagnostics.Process.Start("路径")打开指定程序
先列出这些吧
使用VB.net编写屏蔽热键的方法有很多中,比如说使用系统的API函数,也可以使用钩子来进行屏蔽.还有一种就是.net带的一种方法,首先来判断所按下去的键,然后再执行操作等事件.比如说:if (e.keycode==keys.D){e.handle=true}在keydown事件里面处理!这样就可以屏蔽了D键. 实例:if ((Control.ModifierKeys == Keys.Alt) (e.KeyCode == Keys.F4))
{
e.Handled = true;
}还有一种办法就是不通过屏蔽热键来实现,就是通过设置焦点.你可以把你程序窗口设置为主焦点,这样其他程序一般就无法在你的程序前面了.实现屏蔽的作用.至于任务管理器的话可以通过杀掉进程的办法做到.如下: Process[] p = Process.GetProcesses(); foreach (Process p1 in p)
{
try
{
if (p1.ProcessName.ToLower().Trim() == "taskmgr")//这里判断是任务管理器
{
p1.Kill();
return;
}
}
catch
{
return;
}
}}以上是使用C#编写的,稍微改下就可以了,在,NET里面都差不多!
杭州元帅;highlight=
在一个局域网中,许多系统都要求每台计算机能够保持时间的一致性,WIN2000系统提供了与主域服务器时间同步功能,即工作站只要登录到主域服务器,工作站系统的时间自动与主域服务器时间一致,但接下来的问题是我们如何使主域服务器的时间同步世界标准时间。如要获得世界标准时间,比较精确的做法是使用GPS卫星时钟获得毫秒级精度的标准时间,但这是要money的哦。如果我们在时间精度上只需要秒级的,又能够连接到Internet,则我们可以利用Internet上的标准时间服务器获得标准时间。
事实上在Internet上有三个不同的时间服务,每一个都由Request for Comment(RFC)定义为Internet日期时间标准。这三个标准分别为:RFC-867、RFC-868和RFC-1305。下面就先介绍RFC-867:
RFC867 Daytime协议(RFC867 Daytime Protocol)
本RFC规范了一个ARPA Internet community上的标准。在ARPA Internet上的所有主机应当采用和实现这个标准。
一个有用的测量和调试工具就是daytime服务。它的作用就是返回当前时间和日期,格式是字符串格式。
* 基于TCP的daytime服务
daytime服务是基于TCP的应用,服务器在TCP端口13侦听,一旦有连接建立就返回ASCII形式的日期和时间(接收到的任何数据被忽略),在传送完后关闭连接。
* 基于UDP的daytime服务
daytime服务也可以使用UDP协议,它的端口也是13,不过UDP是用数据报传送当前时间的。接收到的数据被忽略。
* Daytime格式
对于daytime没有特定的格式,建议使用ASCII可打印字符,空格和回车换行符。daytime应该在一行上。
下面是两种流行的格式:
一种流行的格式是:Weekday, Month Day, Year Time-Zone
例子:Tuesday, February 22, 1982 17:37:43-PST
另一种流行的格式用于SMTP中:dd mmm yy hh:mm:ss zzz
例子:02 FEB 82 07:59:01 PST
注意:对于机器来说,有用的时间采用了时间协议(Time Protocol RFC-868)
接下来我们用VB程序实现通过RFC867协议设置我们自己的计算机系统时间,为使程序简化,程序未进行日期校正,只进行时间校正。在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
Option Explicit
'采用RFC867 Daytime协议获取标准时间例程
'为中科院国家授时中心,采用北京时间
'时间格式:Mon Jul 26 09:58:57 2004
'time.nist.gov为美国标准技术院,采用格灵威时间
'时间格式:53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST) *
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim NoSrv As Boolean
Dim TimeFromNet
Private Sub Form_Load()
Winsock1.Protocol = sckTCPProtocol '采用TCP协议
NetTime "" '首先取中科院国家授时中心时间
If NoSrv Or TimeFromNet = "" Then
'若未取到中科院国家授时中心时间,则取美国标准技术院时间
NetTime "time.nist.gov"
If NoSrv Or TimeFromNet = "" Then
'若不能取美国标准技术院时间,则报错
MsgBox "检测不到网络标准时间服务器time.nist.gov!"
Else
'为使网络传输误差减小,第2次再取美国标准技术院时间
NetTime "time.nist.gov"
If TimeFromNet = "" Then
MsgBox "网络标准时间服务器time.nist.gov超时!"
Else
TimeFromNet = Mid(TimeFromNet, 17, 8)
TimeFromNet = TimeSerial((Hour(TimeFromNet) + 8) Mod 24, Minute(TimeFromNet), Second(TimeFromNet))
Time = TimeFromNet '设置系统时间
End If
End If
Else
'为使网络传输误差减小,第2次再取中科院国家授时中心时间
NetTime ""
If TimeFromNet = "" Then
MsgBox "网络标准时间服务器超时!"
Else
Time = Mid(TimeFromNet, 12, 8) '设置系统时间
End If
End If
End
End Sub
'关闭Winsock子程序
Private Sub Winsock1_Close()
If Winsock1.State sckClosed Then
Winsock1.Close
End If
End Sub
'Winsock接收数据事件
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
TimeFromNet = String(bytesTotal, " ")
Winsock1.GetData TimeFromNet, vbString, bytesTotal
End Sub
'Winsock出错事件
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
NoSrv = True
End Sub
'从互联网上标准时间提供网站获取标准时间
Private Sub NetTime(TimeSrv As String)
NoSrv = False
TimeFromNet = ""
If Winsock1.State sckClosed Then Winsock1.Close
Winsock1.RemoteHost = TimeSrv ' "" 或 "time.nist.gov"
Winsock1.RemotePort = 13
Winsock1.LocalPort = 0
Winsock1.Connect
Do While TimeFromNet = "" '循环等待标准时间网站返回时间数据
If NoSrv Then Exit Do '若Winsock出错,则跳出循环等待
Sleep 55
DoEvents
Loop
If Winsock1.State sckClosed Then Winsock1.Close
End Sub
搜索更多相关主题的帖子: internet 标准
上面介绍了RFC-867标准和VB例程,显然RFC-867标准采用返回当前时间和日期的格式是字符串格式以及对于daytime没有特定的格式(例如:中科院国家授时中心为"Mon Jul 26 09:58:57 2004",而美国标准技术院为"53212 04-07-26 02:00:12 50 0 0 488.3 UTC(NIST)"),这2点似乎都不是太舒服,因此我们希望Internet上的标准时间服务器最好能够返回具有标准格式的数字类型数据,其实RFC在制定RFC-867标准时已经考虑了我们的意见,因为他同时还推出了RFC-868标准,下面就介绍RFC-868:
RFC868 时间协议
(RFC868 Time Protocol)
本RFC规范了一个ARPA Internet community上的标准。在ARPA Internet上的所有主机应当采用和实现这个标准。
此协议提供了一个独立于站点的,机器可读的日期和时间信息。时间服务返回的是以秒数,是从1900年1月1日午夜到现在的秒数,天哪,也不小呢。
设计这个协议的一个重要目的在于,网络上的许多主机并没有时间的观念,在分布式的系统上,我们可以想一想,北京的时间和东京的时间如何分呢?主机的时间往往可以人为改变,而且因为机器时钟内的误差而变得不一致,因此需要使用时间服务器通过选举方式得到网络时间,让服务器有一个准确的时间观念。不要小看时间,这对于一些以时间为标准的分布运行的程序简单是太重要了。
这个协议可以工作在TCP和UDP协议下。下面是通过TCP协议工作的时间协议的工作过程:这里S代表服务器,U代表客户。
S: 检测端口37
U: 连接到端口37
S: 以32位二进制数发送时间
U: 接收时间
U: 关闭连接
S: 关闭连接
服务器在端口37上监听连接。当连接建立后,服务器返回一个32位的时间值,然后关闭连接。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会拒绝连接或不发送任何数据而直接关闭连接。
下面我们看看使用UDP协议的情况:这里S代表服务器,U代表客户。
S: 检测端口37
U: 发送一个空数据报到端口37
S: 接收这个空数据报
S: 发送包含32位二进制数(用于表示时间)的数据报
U: 接收时间数据报
服务器在端口37上监听数据包。当一个数据包来后,服务器返回一个包含32位的时间的数据包。这个过程也不难,如果服务器不能决定现在是什么时间,服务器会抛弃接收到的数据报而不作出任何应答。
* 时间
时间是由32位表示的,是自1900年1月1日0时到当前的秒数,我们可以计算一下,这个协议只能表示到2036年就不能用了。(但是我们也知道计算机发展速度这么快,可能到时候就会有更好的协议代替这个协议,或者有已经想出有效的解决办法了。)
下面是些例子:
the time 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT,
2,398,291,200 corresponds to 00:00 1 Jan 1976 GMT,
2,524,521,600 corresponds to 00:00 1 Jan 1980 GMT,
2,629,584,000 corresponds to 00:00 1 May 1983 GMT,
以及 -1,297,728,000 corresponds to 00:00 17 Nov 1858 GMT.
接下来我们用VB程序实现通过RFC868协议设置我们自己的计算机系统时间,为使程序简化,程序未进行日期校正,只进行时间校正。不过这个例程比上面的程序要完善得多,首先他可以读取全球20个标准时间服务器的时间数据,第二他采用了网络延时的补偿,第三对网络延时超过3秒的标准时间服务器进行了过滤。在FORM1中添加1个Winsock控件,将下面代码剪贴到FORM1的代码窗体中即可:
Option Explicit
'时间协定(RFC-868)提供了一个32位元的数字,用来表示从1900年1月1日至今的秒数。
'该时间是UTC(不考虑字母顺序,它表示世界时间座标(CoordinatedUniversalTime)),
'它类似於所谓的格林威治标准时间(GreenwichMeanTime)或者GMT-英国格林威治时间。
'用TCP获得准确时间的程式应该有如下步骤:
'1 连结到提供此服务的端口37;
'2 接收32位元的时间;
'3 关闭连结。
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Dim NoSrv As Boolean
Dim TimeFromNet '存放从时间网站读取的秒数
Dim TimeURL(19) As String '20个时间提供网站的URL
'程序入口
Private Sub Form_Load()
Dim i As Long, T0 As Single
Dim HH As Integer, MM As Integer, SS As Integer '时、分、秒
Me.Show
CDec (TimeFromNet) '转换为 Decimal 子类型,28位整数
TimeURL(0) = "" '首先取中科院国家授时中心时间
TimeURL(1) = "time.nist.gov" '美国标准技术院
TimeURL(2) = "time-a.timefreq.bldrdoc.gov"
TimeURL(3) = "nist1.datum.com"
TimeURL(4) = "nist1-dc.glassey.com"
TimeURL(5) = "nist1-ny.glassey.com"
TimeURL(6) = "nist1-sj.glassey.com"
TimeURL(7) = "utcnist.colorado.edu"
TimeURL(8) = "time-b.timefreq.bldrdoc.gov"
TimeURL(9) = "time-c.timefreq.bldrdoc.gov"
TimeURL(10) = "time-a.nist.gov"
TimeURL(11) = "time-b.nist.gov"
TimeURL(12) = "nist1.aol-va.truetime.com"
TimeURL(13) = "nist1.aol-ca.truetime.com"
TimeURL(14) = "time-nw.nist.gov"
TimeURL(15) = "Time-b.timefreq.bldrdoc.gov"
TimeURL(16) = "Time-c.timefreq.bldrdoc.gov"
TimeURL(17) = "ptbtime1.ptb.de"
TimeURL(18) = "clock.cmc.ec.gc.ca"
TimeURL(19) = "chronos.csr.net"
For i = 0 To 19
Me.Caption = "正在联接—" TimeURL(i)
NetTime TimeURL(i) '首次读取授时中心时间
If (Not NoSrv) And TimeFromNet 0 Then '如果时间读取成功
'为使网络传输误差减小,二次再取授时中心时间
T0 = Timer '为减小网络延时引起的误差,先读取当前时间
NetTime TimeURL(i) '二次读取授时中心时间
If (Not NoSrv) And TimeFromNet 0 Then '如果第二次时间读取成功
TimeFromNet = TimeFromNet + Int((Timer - T0) / 2 + 0.5) '加上网络延时补偿(延时/2为延时补偿)
TimeFromNet = TimeFromNet - 86400 * Int(TimeFromNet / 86400) '以天取模(86400秒)
SS = TimeFromNet Mod 60 '取秒
TimeFromNet = TimeFromNet 60
MM = TimeFromNet Mod 60 '取分
HH = ((TimeFromNet 60) + 8) Mod 24 '取小时(北京时间+8)
' MsgBox "网络延时:" (Timer - T0)
Time = TimeSerial(HH, MM, SS) '设置系统时间
Exit For '取时完毕,退出循环
End If
End If
Next i
If i 19 Then
MsgBox "无法取得网络时间!"
End If
End
End Sub
'关闭Winsock事件
Private Sub Winsock1_Close()
If Winsock1.State sckClosed Then
Winsock1.Close
End If
End Sub
'Winsock接收数据事件
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim TmpData
Winsock1.GetData TmpData
TimeFromNet = TmpData(3) + TmpData(2) * 256 + TmpData(1) * 256 * 256 + TmpData(0) * 256 * 256 * 256
End Sub
'Winsock出错事件
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
NoSrv = True
End Sub
'从互联网上标准时间提供网站获取标准时间
Private Sub NetTime(TimeSrv As String)
Dim i As Integer '超时计数器
i = 0
NoSrv = False
TimeFromNet = 0
If Winsock1.State sckClosed Then Winsock1.Close
Winsock1.RemoteHost = TimeSrv '时间提供网站的URL
Winsock1.RemotePort = 37 '时间协定(RFC-868)指定端口
Winsock1.LocalPort = 0
Winsock1.Connect
Do While TimeFromNet = 0
i = i + 1
If NoSrv Or i 50 Then Exit Do '若Winsock出错或超时约3秒,则时间获取失败
Sleep 55
DoEvents
Loop
If Winsock1.State sckClosed Then Winsock1.Close
End Sub
Edited by: 杭州元帅
最精确的网络时间协议应该是RFC 1305—NTP(Network Time Protocol)了,它能够1-50 ms 的时间精确度,但该协议非常复杂,另外很抱歉我手头没有RFC 1305中文翻译资料,不过后来RFC又出了一个RFC1769 —SNTP(Simple Network Time Protocol),简化了一些RFC 1305要求的操作和使用范围,下面就介绍RFC1769 —SNTP:
Network Working Group D. Mills
Request for Comments: 1769 University of Delaware
Obsoletes: 1361 March 1995
Category: Informational
(RFC1769 ——Simple Network Time Protocol)
本备忘录的状况:
本备忘录为Internet community提供了信息,但不规定任何一种类型的 Internet 标准。 本备忘录的分发没有限制。
概要
本备忘录描述简单网络时间协议(SNTP),这是网络时间协议(NTP) 的一个改写本,NTP协议适用于同步因特网上的计算机时钟。当不须要实现RFC 1305 所描述的NTP完全功能的情况下,可以使用SNTP。它能用单播方式(点对点)和广播方式(点对多点)操作。它也能在IP 多播方式下操作(可提供这种服务的地方)。SNTP与当前及以前的NTP版本并没有大的不同。但它是更简单,是一个无状态的远程过程调用(RPC),其准确和可靠性相似于UDP/TIME 协议在RFC868描述中所预期的。
本备忘录淘汰相同的标题的RFC 1361。它的目的是解释用广播方式操作的协议模式,提供某些地方的进一步说明并且改正一些印刷上的错误。在NTP版本3 RFC 1305中说明的工作机理对SNTP的实现不是完全需要的。本备忘录的分发没有限制。
目录
1. 介绍
2. 工作模式与地址分配
3. NTP时间戳格式
4. NTP 报文格式
5. SNTP 客户端操作
6. SNTP 服务器操作
7. 参考资料
8. 安全考虑
9. 作者的地址
1. 介绍
RFC 1305 [MIL92] 指定网络时间协议(NTP)来同步因特网上的计算机时钟。它提供了全面访问国家时间和频率传播服务的机制,组织时间同步子网并且为参加子网每一个地方时钟调整时间。 在今天的因特网的大多数地方, NTP 提供了1-50 ms 的精确度,精确度的大小取决于同步源和网络路径等特性。
RFC 1305 指定了NTP协议机制中的事件,状态,传输功能和操作,另外,还有可选择的算法,它改进测时质量并且减少了一些同步源中可能存在的错误。为了获得因特网上主要路径的延时精确到毫秒级,使用一些复杂的算法或者他们的等价算法是必要的。但是,在许多场合这样的精确度是不要求,或许精确到秒已足够了。在这样的情况下,更简单的协议例如“时间协议”[POS83 ]已被使用。这些协议通过基于RPC交换:客户端请求此刻时间,然后服务器回传从某个已知时间点到现在的秒钟数。
NTP被设计成了性能差异很大的客户端及服务器均能适用,且适用于客户端及服务器所在网路有大范围的网络延迟和抖动的情况。今天的因特网上的NTP同步子网的大多数用户使用一个软件包包括了一整套的NTP 的选择和算法,是一个比较复杂,实时的应用系统。软件要适用于多种硬件平台:从巨型计算机到个人计算机。要在这样的范围都适用,它的庞大尺寸和复杂性就不适合于很多应用了。按照要求,探求一些可供选择的访问策略( 使用适合于精确度要求不是
很严格的简单软件)是有用的。
本备忘录描述简单网络时间协议(SNTP),它是一个简化了的NTP服务器和NTP客户端策略。SNTP在协议实现上没有什么更改,在最近也不会有什么变动。 访问范例与UDP/TIME 协议是一致的,实际上,SNTP应该更容易适用于使用个人计算机的 UDP/TIME 客户。而且,SNTP 也被设计在一个专门的服务器( 包括一台集成的无线电时钟)里操作。由于在系统里的那些各种各样反应机制的设计和控制,交付调节时间精确到微秒是可能的。这样的专门设计是切实可行的。
强烈建议SNTP 仅仅在同步子网的末端被使用。 SNTP 客户端应该仅在子网的叶子( 最高的阶层) 操作并在配置过程中没有依靠其它NTP或者SNTP客户端来同步。SNTP 服务器应该仅在子网的根( 阶层1) 操作并在配置过程中,除一台可靠的无线电时钟外中没有其它同步源。只有使用了有冗余的同步源及不同的子网路径及整套NTP实现中的crafted 算法,主服务器通常期望的可靠性才有可能达到。这种做法使主同步源在无线电时钟通信失败或者交付了错误时间时,还能用到其它几个无线电时钟和通向其它主要服务器的备份路径。因此,应该仔细考虑客户端中SNTP的使用,而不是在主服务器里的NTP的使用。
2. 工作模式与地址分配
象NTP一样,SNTP 能在单播(点向点) 或者广播(点对多点) 模式中操作。单播客户端发送请求到服务器并且期望从那里得到答复,并且(可选的),得到有关服务器的往返传播延迟和本地时钟补偿。广播服务器周期性地送消息给一指定的IP 广播地址或者IP多播地址,并且通常不期望从客户端得到请求,广播客户端监听地址但通常并不给服务器发请求。一些广播服务器可能选择对客户端作出反应请求以及发出未经请求广播消息;同时一些广播客户端可能会送请求仅为了确定在服务器和客户端之间的网络传播延迟。
在单播方式下,客户端和服务器的IP 地址按常规被分配。在广播方式下,服务器使用一指定的IP播送地址或者IP多播地址,以及指明的媒介访问播送地址,客户端要在这些地址上帧听。为此,IP 广播地址将限制在一个单独的IP子网范围,因为路由器不传播IP广播数据报。就以太网而论,例如,以太网媒介访问广播地址(主机部分全部为1) 被用于表示IP广播地址。
另一方面,IP 多播地址将广播的潜在有效范围扩展到整个因特网。其真实范围,组会员和路由由因特网组管理协议(IGMP) 确定 [DEE89 ],对于各种路由协议,超出了这份资料的讨论范围。 就以太网而论,例如,以太网媒介访问播送地址(全部为1)要和分配的224.0.1.1 的IP 多播地址合用。 除了IP 地址规范和IGMP,在服务器操作IP广播地址或者IP多播地址没有什么不同。
广播客户端帧听广播地址,例如在以太网情况下主机地址全部为1的。就广播地址的IP而论,没有更进一步规定的必要了。在IP多组广播情况下,主机可能需要实现IGMP,为的是让本地路由器把消息拦截后送到224.0.1.1 多播组。这些考虑不属于这份资料的讨论范围。
就当前指定的SNTP而论,其真正的弱点是多目广播客户端可能被一些行为不当或者敌对的在因特网别处的SNTP/NTP 多播服务器攻击而瘫痪,因为目前全部这样服务器使用相同的IP 多播地址:224.0.1.1 组地址。 所以有必要,存取控制要基于那些以客户端信任的服务器源地址,即客户端选择仅仅为自己所知的服务器。或者,按照惯列和非正式协议,全部NTP多播服务器现在在每条消息内应包括已用MD5加密的加密位,以便客户端确定消息没有在传输中被修改。SNTP 客户端能实现那些必要加密和密钥分发计划在原则上是可能的,但是这在SNTP被设计成的那些简单的系统里不可能被考虑。
考虑到没有一个完整的SNTP规范,故IP 广播地址将使用在IP子网和局域网部分(指有完整功能的NTP服务器和SNTP客户端在同一子网上的局域网),而对于IP 多播地址来说,将只能用在为达到以上相同目而设计的特例中。尤其,只有服务器实现了RFC 1305 描述的NTP认证时(包括支持MD5消息位的算法),在SNTP 服务器里的IP 多播地址才被使用。
3. NTP时间戳格式
sntp使用在RFC 1305 及其以前的版本所描述标准NTP时间戳的格式。与因特网标准标准一致, NTP 数据被指定为整数或定点小数,位以big-endian风格从左边0位或者高位计数。除非不这样指定,全部数量都将设成unsigned的类型,并且可能用一个在bit0前的隐含0填充全部字段宽度。
因为SNTP时间戳是重要的数据和用来描述协议主要产品的,一个专门的时间戳格式已经建立。 NTP用时间戳表示为一64 bits unsigned 定点数,以秒的形式从1900 年1月1 日的0:0:0算起。整数部分在前32位里,后32bits(seconds Fraction)用以表示秒以下的部分。在Seconds Fraction 部分,无意义的低位应该设置为0。这种格式把方便的多精度算法和变换用于UDP/TIME 的表示(单位:秒),但使得转化为ICMP的时间戳消息表示法(单位:毫秒)的过程变得复杂了。它代表的精度是大约是200 picoseconds,这应该足以满足最高的要求了。
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Seconds Fraction (0-padded) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
注意,从1968 年起,最高有效位(整数部分的0 bit位) 已经被确定,64 位比特字段在2036 年将溢出。 如果NTP或者SNTP在2036 年还在使用的话,一些外部方法将有必要用来调整与1900年及2036 年有关的时间 (136 年的其它倍数也一样)。 用这样的限制使时间戳数据变得很讲究(要求合适的方法可容易地被找到)。从今以后每136 年,就会有200picosecond 的间隔,会被忽略掉,64 个比特字段将全部置为0 ,按照惯列它将被解释为一个无效的或者不可获得的时间戳。
4. NTP 报文格式
NTP 和SNTP 是用户数据报协议( UDP) 的客户端 [POS80 ],而UDP自己是网际协议( IP) [DAR81 ] 的客户端. IP 和UDP 报头的结构在被引用的指定资料里描述,这里就不更进一步描述了。UDP的端口是123,UDP头中的源断口和目的断口都是一样的,保留的UDP头如规范中所述。
以下是SNTP 报文格式的描述,它紧跟在IP 和UDP 报头之后。SNTP的消息格式与RFC-1305中所描述的NTP格式是一致的,不同的地方是:一些SNTP的数据域已被风装,也就是说已初始化为一些预定的值。NTP 消息的格式被显示如下。
1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN |Mode | Stratum | Poll | Precision |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 根延迟 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 根差量 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 参考标识符 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| 参考时间戳(64) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| 原始时间戳(64) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| 接受时间戳 (64) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| 传送时间戳(64) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| |
| 认证符(可
VB6中Mod 运算符功能是两数相除求余。
如果两数中带小数,Mod 会先四舍六入取整,再按整数求余,余数带小数的话只取整数部分。
注意,如果有书说四舍五入,是错的。
在 VB6 用的是所谓银行家算法,是四舍六入:
小数部分比 0.5 小就舍(例如0.4,0.49999),比 0.5 大就进(例如0.6,0.500001),
刚好是 0.5 可能舍可能进,如果小数点前面是偶数就舍(例如2.5 得 2),是奇数就进(例如3.5 得 4)。
Mod 运算符在VB.NET中有改动,余数可以带小数。
以上资料来自:
所以2.5 mod 2结果是0
dim a as integer
a=15563
万位=a\10000
千位=a\1000 mod 10
百位=a\100 mod 10
if a mod 105 then 百位+=1