1 2 j9j 20l 7年4月 .江 :科技信息 I hmgsu Science&Te(:hnology Info ̄’malhm NO.I2 、1)1’il,2017 用VC++6.0开发Windows网络校时软件 王 强 (江苏有线邦联新媒体科技有限公司,江苏南京210001) 摘要:为解决各类计算机网络应用软件中系统时间同步的问题,需要保证服务端时间与客户端时问的一 致 文辛采用微软公司的软件开发工具vC++6.0,通过调用WiDdOWS套接字编程接口提供的Winsock 2.0 API函数,编写出兼容性较强的网络校时代码,再通过调用wi,uh)WS系统的API函数,实现取出和设 置系统时间的功能工作过程如下:服务端软件始终监听客户端的校时请求,当客户端发送校时请求时, 服务端软件根据客户端的IP地址,发送时间信息给客户端,客户端将收到的信息设置到本机,完成时间 同步 由于WiIISO(・k 2.0的编程接口兼容性很强,所以该程序在各类Windows平台均能稳定运行,占用 资源少,方便可靠,有较高的实用价值 关键词:校时;VC++6.0;网络编程;winsock 2.0 AI’l函数 0 引言 发环境中 序的界Ⅱ1I如 3』听爪 . #include<wi11:5:ock2.h> 网络J、训tJ软什中,仃很多软件为r 同T作. 需要 服务器H, ̄lhJ j客, YLH ̄I司的统一,例女Il车站 V,J4: 收费系统、学 号试系统等 1果服务器与客 机之I'HJ的『j、』I 没有校叫‘系统,那么客户机时问不准 确,这样I,j-能冉接造成数据无法同步,数据饺验m错, #pragma co ̄ent(1ib,“WS232”)//链接手lJIIIS2 32.1ib 图2代码示例 会导敛软件不能JI:常上耋行等严重的后果 VC++6.0 是微软公司…品的软件Jf:发丁具,刚VC++6.0可以 便地州Jt J indows系统提供的Al 1 数,编写}}{高 效、稳定的Windows 1 网络校时软件工作流程 网络校 t,J软件的T作流程如 l』 斤, 请 }÷服蓄 图1 T作流程 一l孝罐 l 图3校时程序界面 佼Iilf软件的详 步骤受l 1F: 存VC++6.0开发环境 ,埘 :控件的颜色、肜状、 (J 1客厂IYLI勺服务 lI 发起连接 求校时; (2)服务器 听刊客t'l机校时消求; (3)H6{务器取jH t l的f时『HJ; (4)H}芝务器根据【I J-'J ̄.;:;;=户机的IP地址向客户机 发Hj时问宁符; 状态等都If1控件变量对J 呲ff[ 本文中的控件变匠 如l冬4 4所,J 本文使用的一些雨数 结构休如1表1 所示。 3网络校时软件服务端的程序 首先 程序中加入初始化网络编程的代 : WSADA I A wsaData; (5)客户机接收到时 字符后写入/卜=机完成校时 、 2相关开发知识准备与相关API函数介绍 Win,tows网络编 -I 1,『f11  ̄要J1 J到Winsock库 、一般 序在 渊川Wi13S0(・k 的 数时, 声【』I】winso(-k 头文 ”外,如果想使川1 Winsock API,就必须包含 相心fl',j J乍文f十,如l刳2 J听,J 、 水义所使川的 面比较简汕,住Vc++6.07l: if(WSAStarttip(MAKI ̄WORD(2,1).&wsa1)ata)) / iJkJJ}J WiII(Iows Sockets 1)1』1 / { nl—I is1.InsertSh・ing(一1,” ’illsock尢法 &ff化!”): WSACleanDp(): re[tlrll: 作者简介:王强(1975~),男,江苏南京,本科,网络工程师;研究方向:计算机网络 48—— 第1 2 2017年4 J】江苏科技信息・ 础_百J/c ;L NO.12 April,2017 // 选定的端『]绑定 { IIII is1.1nsertSt,’ing(一 1,”兀法绑定服务 ”): r lUI’I1: ) lnI ist.h,sertString(一1, 服务 ,5”: ̄‘。f“d 厂『:8899 ”): iI1t Em)r: Fr )I’=WSAAsyn(:Select(Se,・V(ZI’S(mket,111 Il nd. WM CLIFN.r ACCEIq .FD ACCEl*r): Er,’()r=WSAAsvn(・Select (II1 Server.111 I1Wn‘1. WM S0CKF:T.FD ACCEVF): 图4控件变量设置 表1函数和结构体 产 卡fI应传递给窗口的消息为wMACCEIrl’,这是自定义jf【i息 / SERVER~ if(E1-rot-==SOCKErr El/ROI1) 蛹数名/结构 作川 { WSAStm’tup甬数 初始化Winsoek函数 (k'lC l—Ii…11两数 获取系统时间函数 Set1 ocal3、ime 数 没置本地时间函数 I islen闲数 监听状态 m一 火败 r IUrn: } === Accept函数 Send函数 连接 发送数据 一f:始船听客,r一连接清求 / if(1isten(n1 Servel・.1)==S()(:KET ERR()I{)/ _量r liet v 数 C(mnet t函数 接收数据 连接请求 连 妾 f 1il_l ist.1nsertString(一1,”服务搽监听火吡叟!”): ret LIrn: .… WSADA rA结构 存储WSAStartup 数后返 的Win(1ows Sockels数据 Sockaddri,1结构 可绑定地址、端口、地址族 _求 } WSACleanup 终止Winsock 2 DI 1.(Ws2—32.d{O的使朋 Ill_1 ist.Inset‘tString(一I,”服务器绑定 IIA " I ̄.成 功。”): A )S: A 的 消 l'ettlrll:, } I11这里是初始化wi1 ̄sock套接 的代码,也就是町 S 以片J来州川网络编程的、必需的一段代码,WSAstartup ist.InsertS!l・ing(一l,”服;}器JF&台仓1建 E SOCKE~i ”): n1殴 —闲数 常洲JH以后,就几f以使J+J Winso(:k库提供的 网络编程闲数了: !J!lJ,捌 WSA{;leanuI,米解除与 Smwet’=socket(PFINET,SOCKSTREAM,0); / 创建服务器端Socket,类 SOCK—STI/EAM, winSock库的绑定并H释放库所fI 朋的系统资源 MJist是程序 玎发中声叫的 ff}『向连接的通信,111一Smwr为全局变量 / if(I11Sm’ver==IN VALIDSOCKET) 件变艟,川 { j 在软件界 T¨_I ist.1nserlSt ri:ng(一1,”无法创建服务器 s(1(.kPt!”): I’t t11l‘『1: 巾 示各种信 息。以l 代码 r}1,如果 始 化网络编程接 『1 Winso(-k火 } |l1 (1(・kServerAddr.sj n famil V:AF IN ET: / l_SOt-kServerA(hh为SockA(hlLil1变吐 / HisockServerA(t(h.-dnad(tn ̄a(I(h=INADI)RAN Y= —一—l』j文,则会 软什 界面中 爪 ¨ 米。Il:常启动 的界而fu1 5 所示 图5启动界面 113 sockServerAddr.sin port=htons(8899): ir(bind(Ill Server.(IJPS0CKADDR)&Ill SO(、kServer ')ckS rvt rAd(Ir)):SOCKETERROR)  ̄ddr,sizeof(ms(49 第1 2朗 201 7年4月 N‘J.12 江苏科技信息・ 石jf{研究 April,2017 服务器存收剑客rI端校时清求时发送校It寸信息 的程序代码。 CString host; ( Tjlife time=CTime::GetCurrentTime //正常返同 } 取“伯 寸问 / sel1(1 sir=time.Format(”%y%1I1%‘I%H%M%S”): 这段代码 先从服务器主机巾获取了系统n ̄l ̄fl, 然后测,I{j了WSAGETSELECTERROR朱判断是 有 网络错误发生、如果没有错误发生, 出现柯客户端 if(WSAGE FSEI }£CTERR0I{(IParam)) 连接到服务器的时候,服务器 Hj系统函数t)eet 蜂呜, 提爪客户机要求校时。随后客厂1YLV,J 1P地址被收出 放人变量控件in—AceessList巾, 示在界lfIf , 系 统tt寸问由send函数发给r客户端 服务器端校时程 序I 常工作界而如 6所示.、 幽丽踌楦研膝务赫 { ::eh)seso('ket(n1一Server); return 0: } switch(WSAGE FSEI 1cC FEVENT(1Param)) { (・dse FI)ACCEIyr: { Beep(1O0。1O0): SO(:kaddr in renloteA(htr; int nAd(h-I en=sizeof(remoteAddr): 、j r- IIll‘vet,(SOCKADDR ) Client=::a(・cept(mSete U &remoteAddr.&nAddrI en): r n O L / n1 Cli nt是Socket类型的令局变埘 / send stt‘.(,elBult'erSeti ength(256);/ selt(tstr 是CString类型全 变量 / ::send(m—CI ient,sendsH’.strlen(sendsir),0);—{ m A(.eess1 ist.Format(”%s”.inet ntoa(remote— AdtI r・.siI1 a(htr)): 图6校时信息显示 远程主机格式化成亨符串 / lTl Aecessl ist=m A ( essList+” 一>’’+” 4 网络校时软件客户端的程序 客厂1端软件 J 的一f 作过 :向服务器发送饺时 请求,当收到服务器的校时信息后,把校时信息的宁 符提取m来写入客户机完成校时 .客户端界m没汁与 服务端没 类似,/f 冉赘述。 要求校【f1f”: 显示校HCV,j信息 / CListBox list: list=(CI istBox*)Get1)lghelll(1DC_1 I FI); list一>lnsertString(一1,mAccess1 ist);/ 数 / 客户机套接字 / SOCKET client=::s‘J(:ket(AF—INE 1、,SOCK— S…I liEAM,IPPRO 1 OTCP): 据椭人在控件中J / host.Fornmt(”%S”.inet ntoa(remoteAddr. sin ad(Ir)): it (elient==l N V ALIDS【)CKET){ list一>InsertString( 1,”已发送”+host+”校时 MessageBox(”套接宁…错”): } 信息”): } / 填写本地公接字变量信息 / } 1)reak; SO( ̄ka(hh-ill sin: sin.sinfamily=AFINET;ease FD CI OSE: sin.sinport=htons(8899): { ::closesocke!(Ill Smwer): / 这里亓『以川变量,渎取蚍 文件 / sin.sina(hh-Stln.Saddr=INADDR——ANY Ilt¥:h / 下面填 服务器变量信息 / break: 50 SOekad(tr in servAddr; 第12期 201 7年4月 江苏科技信息・基础研究 NO.12 April,20I7 servAddr.sinfamily=AFINET; —_d”,ti.wYear,ti.wMonth,ti.wDay,ti.wHour,ti.wMinute,ti. servAddr.sinport=htons(8899): _wSecond); UpdateData(false); / 下面用来连通服务端 / servAddr.sinaddr.Sun.Saddr=inetaddr(” _—::closesocket(client); 127.0.0. );//在本机测试 / netaddrservAddr.sinaddr.Sun.Saddr = i _—__在上面的代码中,首先是设置 了Windows套接 字,填写了本地套接字和 (ServerlP): if(::connect(client,(sockaddr*)&servAddr,sizeof (servAddr))==一1) { //Beep(1000,1000); 服务器套接字的内容。调 用connect函数时,如果连 接服务器失败,软件调用 MessageBox弹出对话框 如图7所示。 图7消息反馈 MessageBox(”连接远程主机失败,程序关 闭”); OnOK(): 如果服务器通信正 常,程序调用recv函数接收数据放人buff,buff中的数 据先通过CString变量重新格式化,再用atoi函数格式 } 化后给系统时间变量赋值,完成数据类型的转换,最后 char buff[256]={01; ::recv(client,buff,256,0): 由SetLocalTime函数写入客户机,完成校时。 5结语 Recvstr=CString(buff); Recv=buffI 件变量 in//显示在第一个控件中,控 //显示在第二个控件中, 网络校时程序运用范围很广泛,本文给出的代码 具有一定的实用价值。笔者在实际开发过程中,客户 端程序使用了读取ini配置文件的方法,来设置程序中 服务端的IP地址以及校时请求的时间问隔。本程序 编写过程中借鉴了(Windows网络与通信程序设计》 和{visualc++实践与提高——网络编程篇》的部分代 码。由于Winsock 2.0具有良好的兼容性,该程序在 Windows各种平台下均可以稳定运行。 参考文献 m Rec=mRecv; 控件变量 SYSTEMTIME ti;//系统时间对象 ti.WYear:atoi(Recvstr.Mid(0,4)): ti.WMonth=atoi(Recvstr.Mid(4,2)): ti.wDay=atoi(Recvstr.Mid(6.2)): ti.WHour=atoi(Recvstr.Mid(8.2)): ti.WMinute=atoi(Recvstr.Mid(10,2)): ti.wSecond=atoi(Recvstr.Mid(1 2.2)): ti.WMilliseeonds=0; [1]汪翔,袁辉.Visual C++实践与提高一网络编程篇[M]. 北京:中国铁道出版社,2001. [2]王艳平,张越.Windows网络与通信程序设计[M]. 北京:人民邮电出版社,2006. SetLocalTime(&ti): m Show.Format(”%d:%d:%d:%d:%d:% (责任编辑王雪芬) Developing Windows time correction program by using VC++6.0 Wang Qiang (JSCN Baron New Media Technology Co.,Ltd.,Nanjing 210001,China) 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 correc,tion software,programming tinting codes of high compatibility. Then it realizes the funotion of taking and setting the system time.The process iS as fi)llows: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 svnchronizati0n.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. Key words:time correction;VC++6.0:network programming;Winsock 2.0 API function