2022年网络程序设计 .pdf

上传人:H****o 文档编号:39736484 上传时间:2022-09-07 格式:PDF 页数:26 大小:2.41MB
返回 下载 相关 举报
2022年网络程序设计 .pdf_第1页
第1页 / 共26页
2022年网络程序设计 .pdf_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《2022年网络程序设计 .pdf》由会员分享,可在线阅读,更多相关《2022年网络程序设计 .pdf(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、课题名称:网络程序设计课程设计子课题名称:实现网络对时程序院(系):计算机学院专业:通信工程班级:学生姓名:学号:指导教师:2012 年6 月20 日名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 26 页 -目录目录 2 摘要 3 正文 3 设计内容 3 设计原理 3 SOCKET 连接过程 3 Server-Client 模型的程序 3 常用的 Socket类型 4 设计过程 4 I程序设计流程及源代码:5 II调试分析过程描述:15 III 结果分析:26 结论 26 参考文献 26 名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 26 页 -摘要电脑时间不对

2、,想校时的时候,又连不上INTERNET,又不想手动输入命令时。怎么办?于是我制作了个校时软件。只要有另台电脑的准确时间,一个局域网内,就可以轻松打两行命令,亦或点击两下鼠标,就可以校时了哦。正文设计内容用socket 编程 接口编写两个程序,分别为客户机程序(client.cpp)和服务 器程序(server.cpp),使用 UDP 传输层协议,该程序应能实现的功能。客户端能够从服务器端取出标准时间,然后同步本机时钟。服务器不需要界面,我就做了一个Win32 Console Application 客户端我做了两个,一个是WIN32 Console Application,和 MFC App

3、Wizardexe 可视化操作设计原理SOCKET 连接过程根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,

4、把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。Server-Client模型的程序服务器,使用 ServerSocket监听指定的端口,端口可以随意指定(由于1024 以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024 的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。客户端,使用Socket 对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。客户端不需要指定打开的端口,通常临时的、动态的分

5、配一个1024 以上的端口。名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 26 页 -Socket 接口是 TCP/IP网络的 API,Socket 接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet 上的 TCP/IP网络编程,必须理解Socket接口。常用的 Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket 是一种无连接的Socket,对应于无连接的UDP 服务应用。设计过程首

6、先设计服务器,创建 Win32 Console Application 的工程工程名称为TimeServer 先编写一个简单的UDPserver 程序然后修改,编写获取时间子函数,加进去。然后编写UDPclient 在本机用命令提示符或cmd 调试调试+反复修改直到我满意为止双机调试,先构建一个小型局域网。用一路由器,设置好IP ADDRESS 因为本机操作,时间是取自本机,又修改本机,无法知道双机调试,先改乱客户端时间不准确然后开始运行程序直到达到功能为止名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 26 页 -还没完。服务器,客户端的WIN32 程序弄好了。但一般使用电脑校

7、时的用户,大多不会输入命令所以在客户端加做个MFC,可视化。最后写报告。I程序设计流程及源代码:给出完整的设计流程图,详细描述程序中各函数的调用关系,以及源程序清单;用的是亿图软件画的,然后截图过来。后来才发现也能复制过来。名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 26 页 -头文件到主函数之前,都是边做边修改。其实是先写主函数,后面在加东西进去的#include stdafx.h#include stdlib.h#pragma comment(lib,ws2_32.lib)#include stdio.h#include#include WINSOCK2.H SYSTEM

8、TIME st;/这个结构体,是微软存放时间的。void GetTime();/这个是子函数,先调用到内存中。定义在末尾先编写的主函数int main(int argc,char*argv)if(argc!=2)fprintf(stderr,Usage:%s n,argv0);return-1;printf(nnn服务器端程序开始!n);printf(n);WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Win

9、sock 初始化错误printf(WSAStartup failed);/输出 Winsock 初始化错误提示信息,return-1;/下面可以用两种方法中的任一种进行版本号匹配的检查/if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)!=0)if(wsaData.wVersion!=wVersionRequested)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 26 页 -/Winsock 版本号不匹配printf(Winsock version numbers do not match);/输出 Winsock

10、版本号不匹配的错误提示信息;WSACleanup();return-1;USHORT nPort=atoi(argv1);/端口号/创建连接套节字SOCKET sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient=INVALID_SOCKET)printf(sClient errorn);return-1;sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(nPort);sin.sin_addr.S_un.S_addr=INADDR_ANY;if(bind(sClient,(sockadd

11、r*)&sin,sizeof(sin)=SOCKET_ERROR)printf(Failed bind()n);return-1;/然后服务器需要个死循环因为我做的是校时,来一个客户端,我就给他一个时间就可以了。所以服务器 设想是做迭代服务器,5 大模型如果在这使用会加大时延,不适用于校时。于是,有了思想就编写代码while(1)char buf120=0;sockaddr_in from;memset(&from,0,sizeof(from);int len=sizeof(from);int rRet=-1;while(rRet=-1)rRet=recvfrom(sClient,buf,12

12、0,0,(struct sockaddr*)&from,&len);bufrRet=0;printf(收到IP 地址为%s 端口号为%d 的 UDP 客户端发送的%d 个字节如下:n%sn,inet_ntoa(from.sin_addr),ntohs(from.sin_port),rRet,buf);名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 26 页 -printf(n);GetTime();char sendBuf20=0;sprintf(sendBuf,%4d-%2d-%2d-%2d-%2d-%2dn,st.wYear,st.wMonth,st.wDay,st.wHou

13、r,st.wMinute,st.wSecond);/这个我是深有体会的,因为我尝试过好多方法。包括把时间编码传出去。但最后发现用sprintf打印到 sendBuf中,发送出去。在客户端,用sscanf按格式写回结构体中,非常方便!int sRet=sendto(sClient,sendBuf,strlen(sendBuf),0,(struct sockaddr*)&from,sizeof(from);printf(回送字符串:%s-共计%d 个字节.,sendBuf,sRet);printf(n);printf(Successful.n);return 0;/注意到GetTime();是要调

14、用新编写的一个子函数,如果直接把代码放在上面,不调用子函数,程序就会很冗余,也不利于修改和读程序。其功能是获取时间void GetTime()GetLocalTime(&st);/这个函数在头文件里微软帮写好了#include,是获取本机时间。printf(%4d-%2d-%2dn,st.wYear,st.wMonth,st.wDay);printf(%2d:%2d:%2dn,st.wHour,st.wMinute,st.wSecond);/打印到屏幕,在调试时可以观看。其实服务器不打印也行,挂在那里没人去看;/名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 26 页 -新建工程

15、,制作WIN 32 客户端#include stdafx.h#include stdlib.h#pragma comment(lib,ws2_32.lib)#include stdio.h#include#include WINSOCK2.H#pragma comment(lib,ws2_32.lib)#include WINSOCK2.H SYSTEMTIME rt;int main(int argc,char*argv)if(argc!=3)fprintf(stderr,Usage:%s n,argv0);return-1;printf(nnn客户端程序开始!n);printf(n);WO

16、RD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock 初始化错误printf(WSAStartup failed);/输出 Winsock 初始化错误提示信息return-1;/下面可以用两种方法中的任一种进行版本号匹配的检查/if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)!=0)if(wsaData.wVersion!=wVersionRe

17、quested)/Winsock 版本号不匹配printf(Winsock version numbers do not match);/输出 Winsock 版本号不匹配的错误提示信息;WSACleanup();名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 26 页 -return-1;USHORT nPort=atoi(argv2);/端口号/创建连接套节字SOCKET sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient=INVALID_SOCKET)printf(sClinet errorn);return-1;sockaddr

18、_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(0);sin.sin_addr.S_un.S_addr=INADDR_ANY;if(bind(sClient,(sockaddr*)&sin,sizeof(sin)=SOCKET_ERROR)printf(Failed bind()n);return-1;sockaddr_in to;to.sin_family=AF_INET;to.sin_port=htons(nPort);to.sin_addr.s_addr=inet_addr(argv1);/以上都是一般的创建WINsock,绑定 POR

19、T跟 IP ADDRESS 实现具体功能是下面的char sendBuf60=请求获取时间!;int sRet=sendto(sClient,sendBuf,strlen(sendBuf),0,(struct sockaddr*)&to,sizeof(to);printf(本 UDP 客户端已发送字符串:%s-共计%d个字节,sendBuf,sRet);printf(n);printf(Successful.n);printf(n);char buf20;sockaddr_in from;memset(&from,0,sizeof(from);int len=sizeof(from);名师资料

20、总结-精品资料欢迎下载-名师精心整理-第 10 页,共 26 页 -int rRet=recvfrom(sClient,buf,20,0,(struct sockaddr*)&from,&len);sscanf(buf,%4d-%2d-%2d-%2d-%2d-%2dn,&rt.wYear,&rt.wMonth,&rt.wDay,&rt.wHour,&rt.wMinute,&rt.wSecond);printf(收到IP 地址为%s 端口号为%d 的 UDP 服务器端回应的%d 个字节如下:n%sn,inet_ntoa(from.sin_addr),ntohs(from.sin_port),rR

21、et,buf);printf(n);printf(%4d-%2d-%2dn,rt.wYear,rt.wMonth,rt.wDay);printf(%2d:%2d:%2dn,rt.wHour,rt.wMinute,rt.wSecond);SetLocalTime(&rt);return 0;/这里就可以看到,是用sscanf那传过来的char*型按格式转到各个参数中去我摸索了很久,发现这个方法很好用。因为buf 是字符串型的,参数不一定是字符型/这样服务器客户端程序就基本完成了。在命令提示符命令为timeserver port timeclient address port 服务器一般是打命令,

22、不需要界面用客户端的,一般希望点下鼠标就能实现所以新建个MFC 的客户端用建立对话框的方法来做。因为涉及C+,类的编程。这里只能写关键代码。注意,我经过调试反复修改,这个工程不能简单用个.cpp,打开就行了打开整个工程用.dsp 下面截图这步不能缺少。因为winsock 涉及到新旧版本直接在Project Settings-C/C+-预处理程序定义-WIN32 LEAN AND MEAN 名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 26 页 -关键代码void CMy234Dlg:OnOK()/TODO:Add extra validation here SetDlgIte

23、mText(IDC_EDIT1,clientname+rnnnn客户端程序开始!nn);WORD wVersionRequested;WSADATA wsaData;wVersionRequested=MAKEWORD(2,2);if(WSAStartup(wVersionRequested,&wsaData)!=0)/Winsock 初始化错误/输出 Winsock 初始化错误提示信息,如“WSAStartup failed”/下面可以用两种方法中的任一种进行版本号匹配的检查/if(LOBYTE(wsaData.wVersion)!=2|HIBYTE(wsaData.wVersion)!=0

24、)if(wsaData.wVersion!=wVersionRequested)名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 26 页 -/Winsock 版本号不匹配/输出 Winsock 版本号不匹配的错误提示信息;WSACleanup();CString port;GetDlgItemText(IDC_EDIT3,port);USHORT nPort=atoi(port);/端口号/创建连接套节字SOCKET sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient=INVALID_SOCKET)sockaddr_in sin;si

25、n.sin_family=AF_INET;sin.sin_port=htons(0);sin.sin_addr.S_un.S_addr=INADDR_ANY;if(bind(sClient,(sockaddr*)&sin,sizeof(sin)=SOCKET_ERROR)sockaddr_in to;to.sin_family=AF_INET;to.sin_port=htons(nPort);CString addr;/IP ADDRESS GetDlgItemText(IDC_EDIT2,addr);to.sin_addr.s_addr=inet_addr(addr);char sendBu

26、f60=请求获取时间!;int sRet=sendto(sClient,sendBuf,strlen(sendBuf),0,(struct sockaddr*)&to,sizeof(to);SetDlgItemText(IDC_EDIT1,clientname+本 UDP客户端已发送字符串-共计个字节 n);名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 26 页 -char buf20=0;sockaddr_in from;memset(&from,0,sizeof(from);int len=sizeof(from);int rRet=recvfrom(sClient,bu

27、f,20,0,(struct sockaddr*)&from,&len);bufrRet=0;sscanf(buf,%4d-%2d-%2d-%2d-%2d-%2dn,&rt.wYear,&rt.wMonth,&rt.wDay,&rt.wHour,&rt.wMinute,&rt.wSecond);SetDlgItemText(IDC_EDIT1,clientname+收到时间 n);SetLocalTime(&rt);/CDialog:OnOK();/可以清楚看到,我是把客户端创建个socket 整个过程编写在一个按钮上是在确定这个按钮上写的,名称我没改是 OnOk void CMy234Dlg

28、:OnOK()点一次,就有校时一次。最后调试+修改 成功编程不是一两次就能成功的,中途出现很多错误。先改第一个,改好了,又出现新的错误。不懂的上网查,还要靠自己基本功与 WIN32 不同的是CString addr;/IP ADDRESS GetDlgItemText(IDC_EDIT2,addr);上面是从编辑框2,获取数据。显示成功,打印到编辑框是SetDlgItemText(IDC_EDIT1,clientname+收到时间 n);当然,也可以用MessagesBox 来弹出消息由于时间有限,来不及做美工了。但整个可视化还是可以的。名师资料总结-精品资料欢迎下载-名师精心整理-第 14

29、页,共 26 页 -II调试分析过程描述:打开命令提示,把背景颜色调了。不黑色印上去,浪费墨水,纸吸了一大块墨水,会软,纸张不好,还会看不起。所以,调成白底黑字。原来是这样名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 26 页 -改成下面那样名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 26 页 -本机调试打开一个命令提示符做如下操作名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 26 页 -再打开一个命令提示符做如下操作名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 26 页 -成功后,看服务器窗口名师资料总结-精品资料欢迎

30、下载-名师精心整理-第 19 页,共 26 页 -本机调试成功后,做双机调试。这样才知道能不能校时。随便搞乱本机时间然后在使用同一路由器自动获取IP 的另一台计算机上打开 CMD(因为另一台是WIN7 操作系统)名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 26 页 -本机如下操作名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 26 页 -然后服务器显示再看本机时间成功了。名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 26 页 -试下 MFC的客户端服务器还是如下打开客户端一个锁定的编辑框,两个可输入编辑框。还有一个按钮。工程名 234,界面

31、整洁美观,可视化,但不加太多花哨名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 26 页 -输入服务器IP ADDRESS,和服务器开的PORT 可以看到,如下结果从名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 26 页 -经过得名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 26 页 -III结果分析:结果是能校时的。服务器客户端都是经过WSAStartup、检查版本、创建 SOCKET 和服务器的绑定。每一步都不能少。服务器,是一个小小的win32 进程。只用了一个端口。由于是迭代服务器,网络层协议还是UDP 协议。所以没使用复杂的模型来加

32、大时延。没人来校时,服务器会等在那里什么也不做。但是那也是一个进程等在那里。CPU还是可以处理其他进程的。模型的使用,更多的是用在并发服务器上。这个是我对这个校时程序,跟学习这门课后的理解。结论经过这次课程设计后,我发现buf 发送接收,这个buf 是 char*型。也可以说是string型,可一般发送数据,可以是”HI,我来了”字符串,可以是其他数据,如这次对时,我要发送的是一微软时间的结构体,结构体里面包含了好多组数据,包括时分秒年月日。怎么发送出去成了问题。我试过好多方法,包括把结构体编码再发送出去,解码时不够准确等错误。最后经过查找网上资料,发现了一对函数sprintf 和 sscan

33、f在 stdio.h 里。它一个是把数据打印到字符串中,另一个是把字符串按格式写入数据中去。对于buf 非常方便。原本做了一对win32 console application,后来为客户端补充了另一个版本,可视化的版本。方便客户使用。这个对C+又复习了一次。比方说怎么把编辑框的数据赋值到要操作的数据中。当然,C+关键是类。我是做出来了,但肯定不是最优化的。因为我把客户端写在一个按钮上,其实应该是写在一个类上或者是一个cpp 上再加进去,用户打开程序就应该加载好了。能做出来还是好的。虽然这个程序没有涉及到模型,但我也是经过反复思考要不要带入模型,带入什么模型,所以也加深了对五大模型的认识。像select是等待到数据可读然后recv.把要来对时的客户放到select这个结构体中,还不是很容易的。总之,通过这次课程设计,我做 win32跟 MFC更加得心应手。参考文献TCP/IP 协议及网络编程技术罗军舟黎波涛杨明吴俊黄健编著清华大学出版社Visual C+网络通信编程技术详解(附光盘)代勇等编著/2011-05-01/机械工业出版社名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 26 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁