计算机网络与通信论文-UDP服务器设计(可编辑)
目录
工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录
UDP服务器设计 2
摘要 2
Abstract 2
一、绪论 3
二、UDP服务器的设计目标与要求 4
三、UDP服务器的设计思路 5 3.1设计相关技术 5
3.1.1 UDP
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
技术 5
3.2.2 C++编程技术 5
3.3.3 TCP/IP协议技术 5 3.3.4 TCP/IP协议与Winsock网络编程接口 5
3.3.5 Winsock API的使用 6 3.2设计思路 6
3.3服务器的主要工作流程 6 四、UDP服务器的实现 7 4.1主要功能模块 7
4.4.1发送 7
4.4.2接收 8
4.4.3数据处理部分 9
4.2程序处理模块 10
4.2.1客户端程序 10 4.2.2服务器端程序 12 五、程序运行结果 13 六、总结 16
参考文献 17
UDP服务器设计
UDP server design 武汉理工大学信息工程学院信研1206 陈维熙
1XXXXXXXXXX64
摘要
本文介绍了UDP服务器的设计,分别设计了服务器端和客户端。运用C++技
术编程来实现UDP服务器的功能。
关键字:UDP 服务器 C++
Abstract
This paper describes the design of the UDP server, were designed
for the server and client. Using C + + programming UDP server.
Keywords:UDP;Server;C++
一、绪论
UDP是TCP/IP协议族为传输层设计的两个协议之一,它在进程与进程的通信过程中,提供了有限的差错校验功能,是一种无连接的,不可靠的协议。UDP在一个较低的水平上完成进程之间的通信,在收到分组的时候没有流量控制机制也没有确认机制,适用于可靠性比较高的局域网。由于UDP采取了无连接的方式,因此协议简单,在一些特定的应用中协议运行效率高。UDP适合一些实时的应用,如IP电话,视频会议,它们要求源主机以恒定的速率发送数据,并且在网络出现拥塞时,可以丢失一些数据,但是延迟不能太大。基于这些特点,流式多媒体通信、多播等应用在传输层采用的就是UDP协议。
因为UDP具有TCP所望尘莫及的速度优势。虽然TCP协议中植入了各种安全保障功能,但是在实际执行的过程中会占用大量的系统开销,无疑使速度受到严重的影响。反观UDP由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。C++这个词在中国大陆的程序员圈子中通常被读做“C加加”,而西方的程序员通常读做“C plus plus”,“CPP”。 它是一种使用非常广泛的计算机编程语言。C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标等等泛型程序设计等多种程序设计风格。
在T?C?P?/?I?P协议族中,有两个互不相同的传输协议:?T?C?P(传输控制协议)和U?D?P(用户数据报协议)。T?C?P为两台主机提供高可靠性的数据通信。它所做的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端的通信,因此应用层可以忽略所有这些细节。而另一方面,?U?D?P则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必需的可靠性必须由应用层来提供
客户机一方的工作流程如下:
1.打开通信信道 申请一个套接字 ,并连接到服务器在主机的保留端口,该端口对应服务器的UDP进程。
2.向服务器发出请求报文,等待接收应答。
3.从服务器方收到最终应答结果,或在不再请求时关闭信道并终止客户机进程。 服务器一方的工作流程如下:
1.打开通信信道 申请一个套接字 ,通知本地主机在某一保留端口接收客户机请求。
2.等待客户机请求到达指定端口。
3.接收到请求,启动一个新进程处理用户请求,同时释放旧进程以响应新的客户请求,一旦服务完成,关闭新进程与客户的通信链路。
4.继续等待客户机请求。
如果不想响应客户机请求,关闭服务器进程。
四、UDP服务器的实现
4.1主要功能模块
4.4.1发送
BOOL CUdpSock::SendBuffer char *buff,DWORD dwBufsize,struct
sockaddr FAR *lpTo
m_lock.Lock ;
WSABUF wsabuf;
WSAOVERLAPPED over;
DWORD dwrecv;
DWORD dwFlags 0;
DWORD dwRet;
BOOL fPending;
int nRet;
//建立 WSABUF和WSAOVERLAPPED 两个结构体 fPending FALSE;
nRet WSASendTo m_Socket,
&wsabuf,
1,
&dwRecv,
IpTo,
sizeof sockaddr ,
&over,
NULL ; if nRet! 0
//检测是否是因为传输未完成而造成的错误
else
//否则给出出错信息
//如果是I/O未完成
if fPending
//等待完成请求或结束事件
dwRet WaitForSingleObject over.hEvent,60000 ;
//判断是否是接收方发出的信号
if dwRet WAIT_TIMEOUT
CloseHandle over.hEvent ;
TRACE "WAIT_TIMEOUT发送失败\n",NULL ;
return FALSE;
if dwRet! WAIT_OBJECT_0
CloseHandle over.hEvent ;
TRACE "发送失败\n",NULL ;
return FALSE;
//查看I/O信息
if !WSAGetOverlappedResult m_socket,
&over,
&dwRecv,
FALSE,
&dwFlags
//结束句柄会话,返回失败信息
//结束句柄会话,返回成功信息
4.4.2接收
BOOL CUdpSock::RecvRequest LPBYTE pBuf,DWORD dwBufSize,struct
sockaddr FAR *lpFrom
//清空接收缓冲区
memset pBuf,0,dwBufSize ; //建立 WSABUF和WSAOVERLAPPED 两个
结构体
wsabuf.buf char * pBuf;
wsabuf.len dwBufSize; memset &over,0,sizeof WSAOVERLAPPED ;
over.hEvent m_hEventSock; dwFlags 0;
fPending FALSE;
int sizeAddr sizeof sockaddr_in ;
nRet WSARecvFrom m_Socket,
&wsabuf,
1,
&dwRecv,
&dwFlags,
lpFrom,
&sizeAddr,
&over,
NULL ;
if nRet! 0
//判断传输是否正常完成
//如果完成
if fPending
//等待结束请求或退出事件
4.4.3数据处理部分
BOOL CUdpSock::DelWithResData struct sockaddr FAR *lpFrom
//接收数据的处理
return TRUE;
//数据的处理部分
void CUdpSock::OnRead
m_translate 0;
sockaddr_in addrfro;
memset &addrfro,0,sizeof sockaddr_in ;
addrfro.sin._family AF_INET;
//如果没有接收请求就返回到读信息函数
if !RecvRequest LPBYTE m_wsaInBuffer.buf,
sizeof m_byInBuffer , sockaddr* &addrfro
TRACE "CClientOverlappedSock::OnRead\n" ;
return;
//如果m_translate不为0,则向m_SimpleIOBuffer缓冲区写信息
if m_translate
m_SimpleIOBuffer.Write m_wsaInBuffer.buf,m_translate ;
try
//处理收到的信息
DelWithResData sockaddr* &addrfro ;
catch ...
TRACE "Udp DelWithResData erro!\n" ;
memset &m_PackHead,0,sizeof PackHead ;
m_bFillHead FALSE;
m_SimpleIOBuffer.Notify ;
return;
4.2程序处理模块
4.2.1客户端程序
#include
#include
#pragma comment lib, "WS2_32" // 链接到WS2_32.lib
BOOL InitWinsock ;
void main
SOCKET socket1; InitWinsock ;
struct sockaddr_in server;
int len sizeof server ;
server.sin_family AF_INET;
server.sin_port htons 1000 ; ///server的
监听端口
server.sin_addr.s_addr inet_addr "172.16.201.186" ; ///server
的地址 socket1 socket AF_INET,SOCK_DGRAM,0 ;
while 1
char buffer[1024] "\0";
printf "input message\n" ;
scanf "%s",buffer ;
if strcmp buffer,"bye" 0
break;
if sendto socket1,buffer,sizeof buffer,0, struct sockaddr*
&server,len ! SOCKET_ERROR
if recvfrom socket1,buffer,sizeof buffer,0, struct sockaddr* &server,&len ! SOCKET_ERROR
printf "rece from server:%s\n",buffer ;
closesocket socket1 ;
BOOL InitWinsock
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested MAKEWORD 2,2 ;
Error WSAStartup VersionRequested,&WsaData ; //启动WinSock2
if Error! 0
return FALSE;
else
if LOBYTE WsaData.wVersion ! 2||HIBYTE WsaData.wHighVersion !
2
WSACleanup ;
return FALSE;
return TRUE;
4.2.2服务器端程序
#include
#include
#pragma comment lib, "WS2_32" // 链接到WS2_32.lib
BOOL InitWinsock ;
void main
SOCKET socket1; InitWinsock ;
struct sockaddr_in local;
struct sockaddr_in from;
int fromlen sizeof from ;
local.sin_family AF_INET;
local.sin_port htons 1000 ; ///监听端口
local.sin_addr.s_addr INADDR_ANY; ///本机 socket1
socket AF_INET,SOCK_DGRAM,0 ; bind socket1, struct sockaddr*
&local,sizeof local ; while 1
char buffer[1024] "\0";
printf "waiting for message from others-------------\n" ;
if recvfrom socket1,buffer,sizeof buffer,0, struct sockaddr* &from,&fromlen ! SOCKET_ERROR
printf "Received datagram from %s--%s\n",inet_ntoa from.sin_addr ,buffer ;
////给cilent发信息
sendto socket1,buffer,sizeof buffer,0, struct sockaddr* &from,fromlen ;
Sleep 500 ;
closesocket socket1 ; BOOL InitWinsock
int Error;
WORD VersionRequested;
WSADATA WsaData;
VersionRequested MAKEWORD 2,2 ;
Error WSAStartup VersionRequested,&WsaData ; //启动WinSock2
if Error! 0
return FALSE;
else
if LOBYTE WsaData.wVersion ! 2||HIBYTE WsaData.wHighVersion !
2
WSACleanup ;
return FALSE;
return TRUE;
五、程序运行结果
(1)将IP地址为192.168.0.4的本机作为客户端的结果 图5.1 本机作为客户端的发送内容 图5.2本机作为客户端时服务器接收情况 (2)将IP地址为192.168.0.4的计算机作为客户端的结果 图5.3局域网内其他主机作为客户端的发送内容 图5.4局域网内其他主机作为客户端时服务器接收情况
六、总结
通过本次计算机与网络的课程设计,我对网络协议有了更深入的认识与了解。尤其是UDP协议。UDP协议的全称是用户数据包协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层――传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。
参考文献
【1】James F.Kurose, Keith W.Ross, 陈鸣译, 计算机网络―自顶向下方
法 第四版 , 机械工业出版社, 2009.1
【2】Larry L. Peterson;Bruce S. Davie, 薛静锋等译, 计算机网络―系
统方法 第四版 , 机械工业出版社, 2009.2
【3】李峰, 陈向益, TCP\IP协议分析与应用编程, 人民邮电出版社, 2008.8
【4】Shivendra S.Panwar, etc, 陈涓译, TCP\IP基础教程 基于实验的方
法 ,人民邮电出版社, 2006.12
【5】吴功宜等. 计算机网络课程设计. 机械工业出版社. 2005.9 Bind Socket Readfrom 等待客户请求 处理服务请求 Sendto Close Socket Bind Sendto Readfrom Close 服务请求 服务应答 服务器 客户机 图
3.1 服务器工作流程 1