《基于UDP的服务器程序.doc》由会员分享,可在线阅读,更多相关《基于UDP的服务器程序.doc(10页珍藏版)》请在三一办公上搜索。
1、目 录摘 要1 课程设计目的12 课程设计要求13相关知识14课程设计分析15程序代码36运行结果与分析107参考文献121 课程设计目的网络服务是以客户机/服务器模式工作的,服务器在特定的端口上提供网络服务。本课程设计的主要目的的是通过编写基于UDP的服务器程序,了解客户机/服务器与UDP协议的工作原理。2 课程设计要求根据后面介绍的UDP协议的工作原理,编写程序实现基于UDP的服务器。1) 以命令行形式运行:UdpServer serve_port其中,UdpServer为程序名,server_port为服务器使用的端口号。2) 输出内容:服务器与客户端的交互过程,例如:UDP Serve
2、r Recceive:。UDP Server Send:。3 相关知识UDP协议是一种无连接的 不可靠的传输层协议。从应用层的角度来看,UDP协议在网络层的IP协议的基础上,向应用层的程序提供不可靠的数据包传输服务。UDP协议为上面的应用层提供传输服务。UDP协议主要用于对传输效率要求很高的应用层协议,例如引导协议(BOOTP) 网络时间协议(NTP) 简单网络管理协议(SNMP) 简单的文件传输协议(TFTP)等。另外,域名服务器(DNS) 同时依赖于TCP与UDP协议。由于UDP协议采用无连接的工作方式,并且只提供有限的差错控制,因此UDP协议简单并且执行效率很高。UDP协议没有采用基于窗
3、口的流量控制机制,当数据包过多时在接收端可能会出现溢出,接收端无法判断在传输中出现那种错误,应用层还需要提供一定的差错控制功能。目前,一些实用要求一恒定速率发送数据,并且在网络出现拥塞时可以丢失一些数据,但是不希望数据传输的时延太大,UDP协议正好可以适应这种需求。基于UDP协议的网络应用也采用客户机/服务器模式。在这里,客户机与服务器表示互相通信的两个应用程序的进程,它们分别被称为UDP客户机与UDP服务器。UDP服务器是指提供某种网络服务的应用进程,它通过熟知端口号来向客户提供服务。3.2 TCP/IP协议技术在T C P / I P协议族中,有两个互不相同的传输协议: T C P(传输控
4、制协议)和U D P(用户数据报协议)。T C P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面, U D P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供。3.3 TCP/IP协议与Winsock网络编程接口Winsock规范不是一种网络协议,而是一套开放的、支持多种协议的Windows写的网络编程
5、接口。Winsock可以访问很多种网络协议,可以把它当作一种协议的封装。现在的Winsock已经基本上实现了与协议无关,可以使用Winsock来调用协议的功能3.4WINSOCK API的应用主要涉及到的函数:(1)WSAStartup函数,基本格式为intWSAtartup(WORD wVersionRequestted,LPWSADATAlpWSAData);(2)WSACleanup函数,其基本格式为intWSACleanup (void);(3)socket函数,其格式为 socket(intaf,inttype,int protocol);用于创建一个能够进行网络通信的套接字。(4)
6、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);用来给
7、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,intna
8、melen);使用该函数使客户Socke与监听与计算机特定端口上的服务Socket进行连接,这台计算机由name指定。4 课程设计分析首先编写两个程序分别为客户器与服务器,使得两者建立连接,在客户器中发送命令然后等待服务器提供相应的反映,具体实现如下:对于UDP服务器端,服务程序首先调用套接口函数socket(),然后调用绑定IP地址和协议端口 号函数bind()。之后调用函数recvfrom()接收客户数据,调用sendto()向客户发送数据。 对于UDP客户端,客户机 程序启动后调用套接口函数socket(),然后调用sendto()向服务器发送数据,调用recvfrom()接收服务器数据
9、。 双 方数据交换成功后,各自调用关闭套接口函数close()关闭套接口。UDP套接口通信方式。具体流程图如下:否iRecv=recvfrom()调用失败输出调用失败开始确定端口号输出服务器WSAStartupsListen=SocketBind()是是是否否否否1isend=sendto()!=0调用成功Closesocket(saccept)Closesocket(saccept)结束=0!=0输出接收到的数据、IP地址、端口号=0流程图二:结束提示输入地址否输出调用失败开始带参main()定义变量WSAStartupSocket()Recvfrom()sendto()是是是是是否否否否W
10、SAcleanup()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
11、_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(
12、); 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) /
13、 链接到?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(127.1.1.1); /server的?地?址 1920 socket1=sock
14、et(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,buff
15、er);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=WSASt
16、artup(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_
17、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_INE
18、T,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 Rec
19、eive: %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,buf
20、fer);98 sendto(socket1,buffer,sizeof buffer,0,(struct sockaddr*)&from,fromlen);99 100 Sleep(500);101 102103 closesocket(socket1);104105106 107108 BOOL InitWinsock()109 110 int Error;111 WORD VersionRequested;112 WSADATA WsaData;113 VersionRequested=MAKEWORD(2,2);114 Error=WSAStartup(VersionRequested
21、,&WsaData); /启?动WinSock2115 if(Error!=0)116 117 return FALSE;118 119 else120 121 if(LOBYTE(WsaData.wVersion)!=2|HIBYTE(WsaData.wHighVersion)!=2)122 123 WSACleanup();124 return FALSE;125 126 127 128 return TRUE;129 运行结果与分析(运行结果是否正确,课程设计过程中出现的问题及其解决方案,可扩充的功能及设计等。)客户器在此页面可以输出命令,来等待服务器作出反应。客户器输出命令语句等待服务器反应。此图为客户器输出计算机三班张朝辉的课设组作业的反应界面。7参考文献1谢希仁 编著. 计算机网络 (第5版) .北京:电子工业出版社,20082吴宜功 吴英 编著. 计算机网络课程设计 (第2版). 北京: 机械工业出版社,2012