基于UDP的服务器程序.doc_第1页
基于UDP的服务器程序.doc_第2页
基于UDP的服务器程序.doc_第3页
基于UDP的服务器程序.doc_第4页
基于UDP的服务器程序.doc_第5页
免费预览已结束,剩余6页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品与精品目 录摘 要1 课程设计目的12 课程设计要求13相关知识14课程设计分析15程序代码36运行结果与分析107参考文献12精品与精品1 课程设计目的网络服务是以客户机/服务器模式工作的,服务器在特定的端口上提供网络服务。本课程设计的主要目的的是通过编写基于UDP的服务器程序,了解客户机/服务器与UDP协议的工作原理。2 课程设计要求根据后面介绍的UDP协议的工作原理,编写程序实现基于UDP的服务器。1) 以命令行形式运行:UdpServer serve_port其中,UdpServer为程序名,server_port为服务器使用的端口号。2) 输出内容:服务器与客户端的交互过程,例如:UDP Server Recceive:。UDP Server Send:。3 相关知识UDP协议是一种无连接的 不可靠的传输层协议。从应用层的角度来看,UDP协议在网络层的IP协议的基础上,向应用层的程序提供不可靠的数据包传输服务。UDP协议为上面的应用层提供传输服务。UDP协议主要用于对传输效率要求很高的应用层协议,例如引导协议(BOOTP) 网络时间协议(NTP) 简单网络管理协议(SNMP) 简单的文件传输协议(TFTP)等。另外,域名服务器(DNS) 同时依赖于TCP与UDP协议。由于UDP协议采用无连接的工作方式,并且只提供有限的差错控制,因此UDP协议简单并且执行效率很高。UDP协议没有采用基于窗口的流量控制机制,当数据包过多时在接收端可能会出现溢出,接收端无法判断在传输中出现那种错误,应用层还需要提供一定的差错控制功能。目前,一些实用要求一恒定速率发送数据,并且在网络出现拥塞时可以丢失一些数据,但是不希望数据传输的时延太大,UDP协议正好可以适应这种需求。基于UDP协议的网络应用也采用客户机/服务器模式。在这里,客户机与服务器表示互相通信的两个应用程序的进程,它们分别被称为UDP客户机与UDP服务器。UDP服务器是指提供某种网络服务的应用进程,它通过熟知端口号来向客户提供服务。3.2 TCP/IP协议技术在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。3.3 TCP/IP协议与Winsock网络编程接口Winsock规范不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程接口。Winsock可以访问很多种网络协议,可以把它当作一种协议的封装。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用协议的功能3.4WINSOCK API的应用主要涉及到的函数:(1)WSAStartup函数,基本格式为intWSAtartup(WORD wVersionRequestted,LPWSADATAlpWSAData);(2)WSACleanup函数,其基本格式为intWSACleanup (void);(3)socket函数,其格式为 socket(intaf,inttype,int protocol);用于创建一个能够进行网络通信的套接字。(4)closesocket函数格式为:intclosesocket(SOCKET s);用来关闭一个描述符为s的套接字。(5)send 函数格式为:int send(SOCKET s,const char FAR *buf,intlen ,int flags);向TCP连接的另一端发送数据。(6)recv函数格式为:intrecv(SOCKET s, char FAR *buf,intlen, int flags);用来从TCP的另一端接收数据。(7)bind函数格式为:int bind(SOCKET s, conststructsockaddr FAR *name,intnamelen);用来给SOCKET 绑定一个IP地址和端口号。(8)listen函数格式为:int listen (SOCKET s,int backlog);使流套接字S处于监听状态。(9)accept函数格式为:SOCKET accept (SOCKET s, structsockaddr FAR *addr,int FAR *addrlen);该函数从监听状态的的流套接字S的客户连接请求队列取出排在最前面的客户请求,并且创建一个新的套接字来与客户套接字创建连接通道。(10)connect函数格式为:int connect(SOCKET s,conststructsockaddr FAR *name,intnamelen);使用该函数使客户Socke与监听与计算机特定端口上的服务Socket进行连接,这台计算机由name指定。4 课程设计分析首先编写两个程序分别为客户器与服务器,使得两者建立连接,在客户器中发送命令然后等待服务器提供相应的反映,具体实现如下:对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口 号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。 对于UDP客户端,客户机 程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据。 双 方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式。具体流程图如下:否iRecv=recvfrom()调用失败输出调用失败开始确定端口号输出服务器WSAStartupsListen=SocketBind()是是是否否否否1isend=sendto()!=0调用成功Closesocket(saccept)Closesocket(saccept)结束=0!=0输出接收到的数据、IP地址、端口号=0流程图二:结束提示输入地址否输出调用失败开始带参main()定义变量WSAStartupSocket()Recvfrom()sendto()是是是是是否否否否WSAcleanup()Closesocket()Largc2接收数据初始化缓冲区程序二:客户机端程序#include#include#include#define DEFAULT_PORT 5050#define DATA_BUFFER 1024#pragma comment(lib,WS2_32.lib)void main(int argc,char* argv)WSADATA wsaData;SOCKET sClient; int iPort=5050;int iLen;int isend,iRecv;char send_buf=Hello! I am a client;char recv_bufDATA_BUFFER;struct sockaddr_in ser;if(argc2) printf(输入服务器的IP地址:n); return; elsememset(recv_buf,0,sizeof(recv_buf);if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0) printf(Winsock环境初始化失败:n); return; sClient=socket(AF_INET,SOCK_DGRAM,0);if(sClient=INVALID_SOCKET) printf(socket()函数调用失败:%dn,WSAGetLastError(); return;ser.sin_family=AF_INET; ser.sin_port=htons(iPort);ser.sin_addr.s_addr=inet_addr(argv1); iLen=sizeof(ser); isend=sen结束提示输入地址否输出调用失败开始带参main()定义变量WSAStartupSocket()Recvfrom()sendto()是是是是是否否否否WSAcleanup()Closesocket()Largc2接收数据初始化缓冲区5.程序代码5 #include 6 #include 7 #pragma comment(lib, WS2_32) / 链接到?WS2_32.lib 8 BOOL InitWinsock();9 void main()10 11 SOCKET socket1;1213 InitWinsock();14 struct sockaddr_in server;15 int len =sizeof(server);16 server.sin_family=AF_INET;17 server.sin_port=htons(1000); /server的?监听y端?口18 server.sin_addr.s_addr=inet_addr(); /server的?地?址 1920 socket1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);21 while (1)22 char buffer1024=0;23 24 25 printf(UDP Needer please input messagen);26 scanf(%s,buffer);27 if (strcmp(buffer,bye)=0)28 break;29 if (sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,len)!=SOCKET_ERROR)30 printf(UDP Needer Send: %sn,buffer);31 if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&server,&len)!=SOCKET_ERROR)32 printf(Receive from UDP:%sn,buffer);33 34 35 closesocket(socket1);36 3738 BOOL InitWinsock()39 40 int Error;41 WORD VersionRequested;42 WSADATA WsaData;43 VersionRequested=MAKEWORD(2,2);44 Error=WSAStartup(VersionRequested,&WsaData); /启?动WinSock245 if(Error!=0)46 47 return FALSE;48 49 else50 51 if(LOBYTE(WsaData.wVersion)!=2|HIBYTE(WsaData.wHighVersion)!=2)52 53 WSACleanup();54 return FALSE;55 56 57 58 return TRUE;59 6061 #include 62 #include63 #include 64 #pragma comment(lib, WS2_32) / 链接到?WS2_32.lib 65 BOOL InitWinsock();66 void main()67 68 SOCKET socket1;6970 InitWinsock();71 struct sockaddr_in local;72 struct sockaddr_in from;73 int fromlen =sizeof(from);74 local.sin_family=AF_INET;75 local.sin_port=htons(1000); /监听y端?口76 local.sin_addr.s_addr=INADDR_ANY; /本?机7778 socket1=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);7980 bind(socket1,(struct sockaddr*)&local,sizeof local);8182 while (1)83 84 char buffer1024=0;85 printf(UDP Server waiting for message from others-nn);86 if (recvfrom(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,&fromlen)!=SOCKET_ERROR)87 88 printf(UDP Server Receive: %sn,buffer);89 /给?cilent发信?息90 if(strcmp(buffer,gettime)=0)91 92 /获?得?当前系统3时间?93 time_t CurTime;94 time(&CurTime);95 strftime(buffer,sizeof(buffer),%Y-%m-%d %H:%M:%S,localtime(&CurTime);96 sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);97 printf(UDP Server send: %sn,buffer);98 sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论