




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 基于udp的客户/服务器通信程序设计 初始条件:操作系统:xp开发语言:c+要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1. 服务器端功能:接收并显示客户发送的信息,显示该客户ip地址和端口号,并向该客户发送“i am a server. ”的信息。2. 客户端功能:向服务器发送“i am a client.”的信息,接收并显示从服务器收到的信息。课程设计报告主要内容要求: (1) 给出设计思路;(2) 详细描述设计过程, 画出程序流程图; (3) 列出程序代码,并写出程序注释;(4) 给出测试结果。(5) 查阅至少5篇参考文献。(6) 按武汉理工大学课程设计工作规范要求撰写设计报告书,图纸应符合绘图规范。时间安排: 6月 日 查阅资料, 6月 日- 日 方案设计、编程6月 日 撰写设计报告6月 日 答辩指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日1. 设计任务要求设计一个基于基于udp的客户/服务器通信程序设计1. 服务器端功能:接收并显示客户发送的信息,显示该客户ip地址和端口号,并向该客户发送“i am a server. ”的信息。2. 客户端功能:向服务器发送“i am a client.”的信息,接收并显示从服务器收到的信息。2.基于udp协议(面向无连接)的socket编程原理socket适用于网络环境中的进程问通信。它已成为当前许多操作系统的网络api,也是网络操作系统中必不可少的基础功能。随着linux操作系统和internet的不断发展linux网络环境下尤其是基于udp的socket通信技术仍广为注目。文章介绍了socket的编程原理并通过一个java编写的客户服务器程序描述了网络中基于udp的不同主机上的两个进程之间的socket通信机制。2.1 socket通信机制socket(套接字)机制是一种api,是网络应用程序的编程接口。socket是通过标准文件描述符和其它程序通讯的一个方法。每一个套接字都用一个半相关描述:协议本地地址、本地端el来表示;一个完整的套接字则用一个相关描述:协议,本地地址、本地端el、远程地址、远程端口,每一个套接字都有一个本地的由操作系统分配的唯一的套接字号。根据传输数据类型的不同,socket主要分为三类:1)流式socket(sockstream),在这种方式下,两个通讯的应用程序之闻要先建立一种虚拟的连接,提供可靠的、面向连接的通信流,它使用rcp协议。从而保证了数据传输的正确性和顺序的。2)数据报socket(sockdgram),它使用数据报协议udp,定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,并且不保证可靠、无差错。3)原始socket,原始套接字允许对底层协议如ip或icmp直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。22 udp协议的工作原理udp协议是一个面向无连接的协议。其连接的建立不必像tcp那样需要服务器端侦听,也不需要有客户机请求连接,属于一种“强制”性的网络连接。udp提供一对一或一对多的、无连接的数据报服务。该服务对消息中传输的数据提供不可靠的、最大努力的传送,这意味着它不保证数据的到达,也不保证所传送的数据报的顺序是否正确,udp不重新传输丢失的数据。其主要工作是:将应用程序传输过来的数据分块交给网络层,确认接受到分组信息。尽管udp无法像tcp一样提供可靠的数据传输,但udp并不比tcp缺乏优越性。udp在传输效率方面比tcp要高一些,而且许多应用程序并不需要保证严格的传输可靠性,比如视频会议系统等,需要实时的交互,但并不要求音频视频的绝对正确。使用udp协议传输数据时,首先设置客户计算机的local port(本地端e1)属性,而作为服务器的计算机只需要设置remoterhost(远程主机)属性为客户计算机的ip地址或域名即可,并将其remote port属性设置为客户计算机上的local port属性。使用udp端口号时,端口提供了用于发送消息的位黄,每个端口由一个唯一的编号来标识。当应用程序向另一台计算机发送数据时,udp生成一个数据头。包括源端口,这些端口提供送达信息所需要的地址。udp协议还为数据和数据头计算出求和检验的值,在目标计算机中,数据包被传递至udp协议程序并送到目的地端口。2.2.1服务器端(接收端)程序设计步骤:1).加载套接字库2).创建套接字(socket)3).将套接字绑定到一个本地地址和端口上(bind)4).等待接收数据(recvfrom)5).关闭套接字(closesocket)2.2.2客户端(发送端)程序设计步骤:1).加载套接字库2).创建套接字(socket)3).向服务器发送数据(sendto)4).关闭套接字(closesocket)socket(),建立数据报式套接字,返回套接字号ssocket(),建立数据报式套接字,返回套接字号s服务器方客户方bind(),将套接字s与本地的地址相连bind(),将套接字s 与本地地址相连相连sendto()/recvfrom,通过套接字s交换数据recvfrom()/sendto(),通过套接字s 读/写数据,直到数据交换完。closesocket(),关闭套接字s,结束服务closesocket(),关闭套接字,结束对话图1-1 无连接协议的套接字调用时序图2.3.程序流程图2.3.1客户端程序流程图开始加载套接字(winsock)库创建socket()套接字,设置客户端ip和端口号输入信息gets(sendbuf);sendto();发送数据到servrecvfrom=socket_error printf(error:%d,errcode)break;退出循环 ynrecvbuf0=qprintf(the chat end!);break;退出循环 y nclosesocket(sockclient);wsacleanup();输出接收到的信息结束图2-1 客户端程序流程图2.3.2服务器程序流程图开始加载套接字(winsock)库创建socket()设置服务器端的地址结构和相关属性将套接字和服务器地址结构绑定,bind();从客户端接受数据result=recvfrom();result=socket_errorprintf(error:%d,errcode)break;退出循环 nyrecvbuf0=qprintf(the chat end!);break;退出循环 ny输出客户端发来的信息sprintf();printf();closesocket(sockclient);wsacleanup();结束gets(sendbuf);输入信息sendto();将信息发送给客户端图2-2 服务器程序流程图2.4.创建基于udp协议的程序设计所涉及的相关函数说明2.4.1.int wsastartup(wordwversionrequested,lpwsadatalpwsadata):作用是加载套接字库和进行套接字库的版本协商a.参数wversionrequested:用于指定准备加载的winsock库的版本,高位字节指定所需要的winsock库的副版本,低位字节则是主版本,可用makeword(x,y)(其中,x为高位字节,y为低位字节)方便获得wversionrequested的正确值。b.参数lpwsadata:指向wsadata结构的指针,wsastartup用其加载的库版本有关的信息填在这个结构中应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段2.4.2.socket socket(int af,int type,int protocol):a.该调用要接收三个参数:af、type、protocol。参数af 指定通信发生的区域,unix 系统支持的地址族有:af_unix、af_inet、af_ns 等,而dos、windows 中仅支持af_inet,它是网际网区域。因此,地址族与协议族相同。b.参数type指定socket类型,对于1.1版本的socket,它只支持两种类型的套接字,sock_stream指定产生流式套接字,sock_dgram产生数据报套接字。c.参数protocol与特定的地址家族相关的协议,如果指定为0,那么他就会根据地址格式和套接字类别,自动为你选择一个合适的协议。这是推荐使用的一种选择协议的方式。2.4.3. int bind(socket s,const struct sockaddr far *name,int namelen) :a.第一个参数指定要绑定的套接字,第二个参数指定该套接字的本地地址信息,是指向sockaddr结构的指针变量,由于该地址结构是为了所有的地址家族准备使用的,这个结构可能(通常会)随使用的网络协议不同而不同,所以,要用第三个参数指定该地址结构的长度。sockaddr机构定义如下:struct sockaddru_short sa_family;char sa_data14;b.上述结构第一个字段指定该地址家族,在这里必须设为af_inet。sa_data仅仅是表示要求一块内存分配区,起到占位的作用,该区域中指定与协议相关的具体地址信息。由于实际要求的只是内存区,所以对于不同的协议家族,用不同的结构来替换sockaddr。在tcp/ip中,我们可以用sockaddr_in结构来代替sockaddr,以方便我们填写地址信息。c.struct sockaddr_inshortsin_family;unsigned shortsin_port;structin_addrsin_addr;charsin_zero8;sin_family表示地址族,对于ip地址,sin_family成员将一直是af_inet;成员sin_port指定的将要分配给套接字的端口;成员sin_addr给出的是套接字的主机ip地址;sin_zero只是一个填充数,以使sockaddr_in结构和sockaddr结构的长度一样,一般不用设置。除了sin_family外,sockaddr_in其他成员是按网络字节顺序表示的。所以需要进行转换:htonl(inaddr_any),htons(6000),其中6000是端口号。另外结构体的名称大写和小写指的是同一个。将ip地址指定为inaddr_any,允许套接字向任何分配给本机器的ip地址发送或接收数据。一般一台机器一个网卡,但对于多网卡的机器,inaddr_any将简化应用程序的编写。将地址指定为inaddr_any,允许一个独立的应用接受发自多个接口的回应。如果我们只想让套接字使用多个ip中的一个地址,必须指定实际地址,要做到这一点,可以用inet_addr()函数,这个函数需要一个ip地址(如8),返回一个适合分配给s_addr的u_long类型的数值。inet_ntoa()函数完成相反的转换,它接受一个in_addr结构体类型的参数并返回一个以点分十进制的ip地址字符串。htonl把一个u_long类型从主机字节序转换为网络字节序。htons把一个u_short类型从主机字节序转换为网络字节序。2.4.4.send函数:向客户端发送指定信息2.4.5.recv函数:得到从客户端传递过来的信息2.4.6.closesocket(socket s):将指定的套接字关闭,从而释放资源2.4.7.wsacleanup():终止对winsocket库的使用3.程序调试与编译运行结果3.1程序调试按照设计要求编写好程序后,开始对程序进行调试,由于程序不是很长,因此调试过程也较为顺利,不过在调试过程中还是遇到了不少问题:3.1.1.由于对socket编程不熟悉,开始时环境变量没有设置好,编译时总是出现error lnk2001;经过查资料得知是因为没有在环境变量设置中添加 “ws2_32.lib”,添加后编译就不会出现上面的错误了;3.2.2.由于对socket的库函数不熟悉,对其中的各种函数误用,导致程序出错;3.2程序编译运行 调试好程序后,对其进行编译运行,其运行结果如下:图3-1 客户端发送数据,服务器接收到数据图3-2服务器向客户端回复数据,客户端接收到数据4.设计总结与体会 本课程设计设计了一个基于udp的客户/服务器通信程序,并用c+语言编程实现了基本功能,该程序能实现从客户端向服务器发送数据,服务器能接收并正确显示客户端的ip地址和端口以及接收到的数据,而且还能向客户端发送数据,客户端也能正确接收并显示出来。通过本次课程设计,我对通过socke编程有了进一步的理解,也学到了很多知识,对通信的底层知识有了进一步的了解,并对udp协议的通信有了深刻的理解,之前只知道有udp这个协议,不知道他的原理,现在通过本次设计,明白了udp通信的原理以及如何通过编程来实现。总之这次课设我收获很大。参考文献1陈伟,刘会衡.计算机网络与通信.北京:电子工业出版社,2010.2谢希仁.计算机网络(5).北京:电子工业出版社,2008.3杨家海.网络管理原理与实用技术.北京:清华大学出版社,2002.4王艳平.windows网络与通信程序设计.北京:人民邮电出版社,2009.5李媛媛.visaul c+网络通信开发入门与编程实践.北京:电子工业出版社,2008. 在vc中的工程设置中的连接下面的ws2_32.lib,否则程序运行错误客户端源程序#include winsock2.h#include stdio.hvoid main() /加载套接字(winsock)库,加载这段代码拷贝于msdn中wsastartup的介绍 word wversionrequested;/定义一个unsigned short类型的变量 wsadata wsadata;/typedef struct wsadata 定义一个wsadata结构体 int err; wversionrequested = makeword( 1, 1 ); /版本号为1.1 err = wsastartup( wversionrequested, &wsadata ); if ( err != 0 ) return; if ( lobyte( wsadata.wversion ) != 1 | hibyte( wsadata.wversion ) != 1 ) wsacleanup( ); return; /创建套接字socket sockclient=socket(af_inet,sock_dgram,0); /sock_dgram为udp传输方式 /typedef u_int socket; sockaddr_in addrserver; /服务器地址结构 typedef struct sockaddr_in sockaddr_in addrserver.sin_addr.s_un.s_addr=inet_addr(); /服务器地址 addrserver.sin_family=af_inet; addrserver.sin_port=htons(6000); /服务器端口号 char tempbuf1000; char recvbuf1000;/定义接收缓冲数组 char sendbuf1000;/定义发送缓冲数组 int len=sizeof(sockaddr);/求sockaddr长度 while(1) printf(plese input the message:n); gets(sendbuf); /得到用户的键盘输入 sendto(sockclient,sendbuf,strlen(sendbuf)+1,0,(sockaddr*)&addrserver,sizeof(sockaddr); int result=recvfrom(sockclient,recvbuf,1000,0,(sockaddr*)&addrserver,&len); if(result=socket_error) int errcode=wsagetlasterror(); printf(error:%d,errcode); break; /退出循环 else if(recvbuf0=q) /对方请求退出 /同样将退出请求发送回去 sendto(sockclient,q,strlen(q)+1,0,(sockaddr*)&addrserver,sizeof(sockaddr); printf(the chat end!); for(int i=0;i65536;i+) for(int j=0;j5000;j+); break; else /将对方发送过来的信息前段加上ip地址进行输出 sprintf(tempbuf,massege from server aid:%s,recvbuf);/sprintf(tempbuf,%s aid:%s,inet_ntoa(addrserver.sin_addr),recvbuf); printf(%sn,tempbuf); closesocket(sockclient); wsacleanup();服务器源程序#include winsock2.h#include stdio.h void main() /加载套接字(winsock)库,加载这段代码拷贝于msdn中wsastartup的介绍 word wversionrequested; wsadata wsadata; int err; wversionrequested = makeword( 1, 1 ); /版本号为1.1 err = wsastartup( wversionrequested, &wsadata ); if ( err != 0 ) return; if ( lobyte( wsadata.wversion ) != 1 | hibyte( wsadata.wversion ) != 1 ) wsacleanup( ); return; /创建套接字 socket sockserver=socket(af_inet,sock_dgram,0); sockaddr_in addrserver; /设置服务器端套接字的地址结构的相关属性 addrserver.sin_addr.s_un.s_addr=htonl(inaddr_any); /设置ip addrserver.sin_family=af_inet; addrserver.sin_port=htons(6000); /设置端口号 /将套接字和服务器地址结构绑定 bind(sockserver,(sockaddr*)&addrserver
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Module7 Unit2 Pandas love bamboo(教学设计)-2024-2025学年外研版(三起)英语六年级上册
- 桂林航天工业学院《机械设计基础2》2023-2024学年第二学期期末试卷
- 武夷学院《办公软件操作实训》2023-2024学年第二学期期末试卷
- 上海财经大学《情报检索3》2023-2024学年第二学期期末试卷
- 大理护理职业学院《新媒体发展前沿》2023-2024学年第二学期期末试卷
- 黑龙江科技大学《计量经济学B》2023-2024学年第二学期期末试卷
- 常熟理工学院《临床流行病学》2023-2024学年第二学期期末试卷
- 荆州学院《西方法律思想史》2023-2024学年第二学期期末试卷
- 武汉东湖学院《嵌入式系统技术及应用》2023-2024学年第二学期期末试卷
- 牡丹江大学《P路由与交换技术》2023-2024学年第二学期期末试卷
- 中医基础理论-
- 水利站工作计划
- 五年级下册音乐课程纲要
- 食材配送、包装、运输、验收、售后服务方案应急预案
- 万千教育学前读懂儿童的思维:支持自主游戏中的图式探索
- 产品外观检验标准通用
- 中石化YC分公司易捷便利店市场营销策略研究
- 医院护理培训课件:《病区环境管理查房》
- 《小羊和蝴蝶》绘本故事
- 钢筋工理论考试题库及答案
- 大数据技术基础及应用教程(Linux+Hadoop+Spark) 习题答案
评论
0/150
提交评论