摘要:为解决各类计算机网络应用软件中系统时间同步的问题,需要保证服务端时间与客户端时间的一致。文章采用微软公司的软件开发工具VC++6.0,通过调用Windows套接字编程接口提供的Winsock2.0 API函数,编写出兼容性较强的网络校时代码,再通过调用Windows系统的API函数,实现取出和设置系统时间的功能。工作过程如下:服务端软件始终监听客户端的校时请求,当客户端发送校时请求时,服务端软件根据客户端的IP地址,发送时间信息给客户端,客户端将收到的信息设置到本机,完成时间同步。由于Winsock 2.0的编程接口兼容性很强,所以该程序在各类Windows平台均能稳定运行,占用资源少,方便可靠,有较高的实用价值。
关键词:校时; VC++6.0; 网络编程; Winsock 2.0 API函数;
Abstract:In order to solve time synchronization problem in computer application software, it is necessary to keep the time of the server and the client in accordance with each other. This paper uses Microsoft VC++6.0, and firstly uses Winsock 2.0 API to program network time correction software, programming timing codes of high compatibility.Then it realizes the function of taking and setting the system time. The process is as follows: the server software listens to the requirement of the client and when The client sends out the requirement, the server sends message to client according to its IP address. The client software sets the received message to local machine to finish time synchronization. Because of the high compatibility of Winsock 2.0 API, this software can run stably under different kinds of Windows platform. It is reliable, convenient, and occupies less resource. Therefore, it is of high practical value.
Keyword:time correction; VC++6.0; network programming; Winsock 2.0 API function;
在网络应用软件中,有很多软件为了协同工作,需要保证服务器时间与客户机时间的统一,例如车站的车票收费系统、学生考试系统等。如果服务器与客户机之间的时间没有校时系统,那么客户机时间不准确,这样可能直接造成数据无法同步,数据校验出错,会导致软件不能正常运行等严重的后果。VC++6.0是微软公司出品的软件开发工具,用VC++6.0可以很方便地调用Windows系统提供的API函数,编写出高效、稳定的Windows程序。
1、网络校时软件工作流程
网络校时软件的工作流程如图1所示。
图1 工作流程
校时软件的详细步骤如下:
(1)客户机向服务器IP发起连接请求校时;
(2)服务器监听到客户机校时请求;
(3)服务器取出本机的时间;
(4)服务器根据请求客户机的IP地址向客户机发出时间字符;
(5)客户机接收到时间字符后写入本机完成校时。
2、相关开发知识准备与相关API函数介绍
Windows网络编程需要用到Winsock库。一般程序在需要调用Winsock库的函数时,需要声明Winsock头文件。另外,如果想使用Winsock API,就必须包含相应的库文件,如图2所示。
本文所使用的程序界面比较简洁,在VC++6.0开发环境中程序的界面如图3所示。
图2 代码示例
图3 校时程序界面
在VC++6.0开发环境中,对于控件的颜色、形状、状态等都由控件变量对其赋值。本文中的控件变量如图4所示。本文使用的一些函数和结构体如表1所示。
3、网络校时软件服务端的程序
首先在程序中加入初始化网络编程的代码:
图4 控件变量设置
表1 函数和结构体
这里是初始化Winsock套接字的代码,也就是可以用来调用网络编程的、必需的一段代码,WSAstartup函数正常调用以后,就可以使用Winsock库提供的网络编程函数了。否则,调用WSACleanup来解除与Win Sock库的绑定并且释放库所占用的系统资源。M_list是程序开发中声明的控件变量,用于在软件界面中显示各种信息。以上代码中,如果初始化网络编程接口Winsock失败,则会在软件界面中显示出来。正常启动的界面如图5所示。
图5 启动界面
服务器在收到客户端校时请求时发送校时信息的程序代码。
这段代码首先从服务器主机中获取了系统时间,然后调用了WSAGETSELECTERROR来判断是否有网络错误发生。如果没有错误发生,当出现有客户端连接到服务器的时候,服务器调用系统函数beep蜂鸣,提示客户机要求校时。随后客户机的IP地址被取出放入变量控件m_Access List中,并显示在界面上,而系统时间由send函数发给了客户端。服务器端校时程序正常工作界面如图6所示。
图6 校时信息显示
4、网络校时软件客户端的程序
客户端软件程序的工作过程:向服务器发送校时请求,当收到服务器的校时信息后,把校时信息的字符提取出来写入客户机完成校时。客户端界面设计与服务端设计类似,不再赘述。
在上面的代码中,首先是设置了Windows套接字,填写了本地套接字和服务器套接字的内容。调用connect函数时,如果连接服务器失败,软件调用Message Box弹出对话框如图7所示。
图7 消息反馈
如果服务器通信正常,程序调用recv函数接收数据放入buff,buff中的数据先通过CString变量重新格式化,再用atoi函数格式化后给系统时间变量赋值,完成数据类型的转换,最后由Set Local Time函数写入客户机,完成校时。
5、结语
网络校时程序运用范围很广泛,本文给出的代码具有一定的实用价值。笔者在实际开发过程中,客户端程序使用了读取ini配置文件的方法,来设置程序中服务端的IP地址以及校时请求的时间间隔。本程序编写过程中借鉴了《Windows网络与通信程序设计》和《visualc++实践与提高———网络编程篇》的部分代码。由于Winsock 2.0具有良好的兼容性,该程序在Windows各种平台下均可以稳定运行。
参考文献
[1]汪翔,袁辉.Visual C++实践与提高-网络编程篇[M].北京:中国铁道出版社,2001.
[2]王艳平,张越.Windows网络与通信程序设计[M].北京:人民邮电出版社,2006.