UDP服务器课程设计_第1页
UDP服务器课程设计_第2页
UDP服务器课程设计_第3页
UDP服务器课程设计_第4页
UDP服务器课程设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

目录 课程设计的目的和意义 2 课程设计的内容和要求 3 课程设计过程 8 发送部分代码实现 9 接收部分代码实现 12 数据处理部分 15 处理部分如下 18 心得体会 20 参考文献 21 1 课程设计的目的和意义 随着经济的发展 社会的进步 计算机越来越深入到我们日常的工作学习及 生活中 成为我们日常生活中不可缺少的辅助工具 随着科学技术的不断提高 计算机科学日渐成熟 其强大的功能已为人们深刻认识 它已进入人类社会的各 个领域并发挥着越来越重要的作用 它已经深入到日常工作和生活的方方面面 比如文字处理 信息管理 辅助设计 图形图像处理 教育培训以及游戏娱乐 等 各行各业的人们无须经过特别的训练就能够使用电脑完成许许多多复杂的 工作 然而 虽然现在世界上已经充满了多如牛毛的各种软件 但它们依然不能 满足用户的各种特殊需要 人们还不得不开发适合自己特殊需求的软件 以前开 发 Windows 应用软件是专业人员的工作 需要掌握许多专业知识和经过特殊的培 训才能胜任 现在不同了 即使你没有接受过严格的程序设计训练 使用各种可 视化编程软件也一样能够开发出功能强大 适合自己特殊需求的应用程序了 特特别是现在越来越发达的网络 随之而来的是巨大的网络数据传输 这就涉 及到一系列的网络编程技术 通常程序所使用的每个 UDP 端口都与一个有限大小的输入队列相联系 这 意味着 来自不同客户的差不多同时到达的请求将由 UDP 自动排队 接收到的 UDP 数据报以其接收顺序交给应用程序 在应用程序要求交送下一个数据报时 UDP 在一个较低水平上完成了通信 在收到分组的时候没有流量控制机制 也 没有确认机制 适用于可靠性能比较好的局域网 由于 UDP 采取了无连接方式 因此协议简单 在一些特定的应用中协议运行效率高 UDP 使用与一些实时的 应用 如 IP 电话等 它们要求源主机以恒定的速率发送时数据 并且在网络出 现拥塞时可以丢失一些数据 但是迟延不能太大 基于这些特点 流式多媒体 通信 多播等应用在传输层采用的就是 UDP 协议 2 因为本人能力有限 加上时间紧迫 所以设计出来的本系统可能功能比较简 单 另外本系统是单机版 不能实现网络互联操作 这些都有待于我在以后的工作 学习中进一步改进 课程设计的内容和要求 UDP User Data Protocol 用户数据报协议 是与 TCP 相对应的协 议 它是面向非连接的协议 它不与对方建立连接 而是直接就把数据包 发送过去 UDP 适用于一次只传送少量数据 对可靠性要求不高的应用环境 比 如 我们经常使用 ping 命令来测试两台主机之间 TCP IP 通信是否正 常 其实 ping 命令的原理就是向对方主机发送 UDP 数据包 然后对方 主机确认收到数据包 如果数据包是否到达的消息及时反馈回来 那么网 络就是通的 例如 在默认状态下 一次 ping 操作发送 4 个数据包 可以看到 发送的数据包数量是 4 包 收到的也是 4 包 因为对方主机收 到后会发回一个确认收到的数据包 这充分说明了 UDP 协议是面向非连 接的协议 没有建立连接的过程 正因为 UDP 协议没有连接的过程 所以 它的通信效果高 但也正因为如此 它的可靠性不如 TCP 协议高 本次课程设计的内容就是设计一个 UDP 服务器实现文件视屏的传输 能对多个个客户端进行管理的实现 而实现的功能是基于 VC 6 0 上实 现 使用的接口函数是 Winsock API 使用的函数简单介绍如下 int WSAStartupo WORD wVersionRequested LPWSADATA lpWSAData wVersionRequested 参数用于指定准备加载的 Winsock 库的版本 高 位字节指定所需要的 Winsock 库的副版本 而低位字节册是主版本 可用 MAKEWORD X Y 其中 x 是高位字节 y 是低位字节 方便地获得 wVersionRequested 的正确值 ipWSAData 参数是指想 WSADATA 结构的指针 WSAStartup 用其加载的 库版本有关的信息填在这个结构中 3 SOCKET socket int af int type int protocol 接收三个参数 第一个参数 af 指定地址族 对于 TCP IP 协议的套接 字 它只能是 AF INET 也可写成 PF INET 第二个参数指定 Socket 类型 对 于 1 1 版本的 Socket 它只支持两种类型的套接字 SOCK STREAM 指定产生流式 套接字 SOCK DGRAM 产生数据报套接字 第三个参数是与指定的地址家族相关 的协议 如果指定为 0 那么它就会根据地址格式和套接字类别 自动为你选 择一个合适的协议 这是推荐使用的一种选择协议的方法 如果这个函数调用 成功 他将返回一个新的 SOCKET 数据类型的套接字描述符 如果调用失败 这 个函数就会返回一个 INVAID SOCKET 错误信息可以通过 WSAGetLastError 函 数返回 4 int bind SOCKET s const struct sockaddr FAR name int namelen 接收三个参数 第一个参数 s 指定要绑定的套接字 第二个参数指定 了该套接字的班底地址信息 是指向 sockaddr 结构的指针变量 由于该地址结 构是为所有的地址家族准备的 这个结构可能 通常会 随所使用的网络协议不 同而不同 所以 要用第三个参数指定该地址结构的长度 sockaddr 结构定义 如下 struct sockaddr u short sa family char sa data 14 sockaddr 的第一个字段 sa family 指定该地址家族 在这里必须设为 AF INET sa data 仅仅是表示要求一块内存分配区 起到占位的作用 该区域 中指定的协议相关的具体地址信息 由于实际要求的只是内存区 所以对于不 同的协议家族 用不同的结构来替换 sockaddr 除了 sa family 外 sockaddr 是按网络字节顺序表示的 在 TCP IP 中 我们可以用 sockaddr in 结构替换 sockaddr 以方便我们填写地址信息 5 u long htonl u long hostlong 转换一个 u long 类型从主机字节序到 TCP IP 网络字节序 u short htons u short hostshort 转换一个 u short 类型从主机字节序到 TCP IP 网络字节序 int listen SOCKET s int backlog 将套接字设置为监听模式 监听连接请求 第一个参数为套接字描述符 第二个参数为等待连接队列的最大长度 SOCKET accept SOCKET s struct sockaddr FAR addr int FAR addrlen 等待客户连接到来 并接受连接请求 第一个为处于监听状态的套接字 第 二个是一个 out 指向一个 buffer 指针用来接收连接实体的地址 当发起连接 时 保存了发起连接的客户端的 IP 地址信息和端口信息 第三个参数用来包含 所返回的地址结构的长度 int send SOCKET s const char FAR buf int len int flags 第一个是套接字 第二个是 buffer 包含了将要被传送的数据 第三个是 buffer 中数据的长度 第四个 flags 将影响 send 调用行为 int recv SOCKET s char FAR buf int len 6 int flags 第一个是套接字 第二个是 buffer 包含了将要被接收的数据 第三个 是 buffer 中数据的长度 第四个 flags 将影响 send 调用行为 int connect SOCKET s const struct sockaddr FAR name int namelen 7 课程设计过程课程设计过程 设计 UDP 服务器的过程如下所示 首先 创建一个 Socket 并监听事件 然 后启动线程接收数据 用一个链表保存所有连上的客户 并通知连接成功 这 样 客户就有机会处理这一事件并作一些动作 最后 当客户断开时 向服务 器发送一个事件 服务器就可以做一些收尾的工作 服务器工作流程如下 Socket Bind Readfrom 等待客户请求 处理服务请求 Sendto Close Socket Bind Sendto Readfrom Close 服务器 客户机 服务请求 服务应答 客户机一端工作的流程如下 1 打开通信信道 申请一个套接字 并连接到服务器在主机的保留端口 该 端口对应的服务器的 UDP 进程 2 向服务器发出请求报文 等待接收应答 3 从服务器方收到的最终应答结果 或在不再请求时关闭信道并终止客户进程 8 服务器一端的工作流程如下 1 打开通信通道 申请一个套接字 通知本地主机在某一保留端口接收客 户机请求到达指定端口 2 等待客户请求到达指定端口 3 接收到请求 启动一个新进程处理用户请求 同时释放旧进程以响应新 的客户请求 一旦服务完成 关闭新进程与客户的通信链路 4 继续等待客户机请求 5 如果不想响应客户机的请求 关闭服务器进程 发送部分代码实现 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 Setup the WSABUF and WSAOVERLAPPED structures 9 memset wsabuf buf buff wsabuf len dwBufSize over hEvent WSACreateEvent fPending FALSE nRet WSASendTo m Socket Socket Completion function if nRet 0 int erro WSAGetLastError if erro WSA IO PENDING fPending TRUE else TRACE1 CUdpSock SendBuffer erro d n erro CloseHandle over hEvent return FALSE 10 If the I O isn t finished if fPending Wait for the request to complete or the exit event to be signaled dwRet WaitForSingleObject over hEvent 60000 Was the recv event signaled if dwRet WAIT TIMEOUT WAIT OBJECT 0 WAIT TIMEOUT CloseHandle over hEvent TRACE WAIT TIMEOUT 发送失败 n NULL return FALSE if dwRet WAIT OBJECT 0 WAIT OBJECT 0 WAIT TIMEOUT CloseHandle over hEvent TRACE 发送失败 n NULL return FALSE 11 Get I O result if WSAGetOverlappedResult m Socket TRACE WSAGetOverlappedResult 发送失败 n NULL return FALSE CloseHandle over hEvent TRACE 发送成功 n NULL m lock Unlock return TRUE 接收部分代码实现 BOOL CUdpSock RecvRequest LPBYTE pBuf DWORD dwBufSize struct sockaddr FAR lpFrom WSAOVERLAPPED over 12 WSABUF wsabuf DWORD dwRecv DWORD dwFlags DWORD dwRet HANDLE hEvents 2 BOOL fPending int nRet Zero the buffer so the recv is null terminated memset pBuf 0 dwBufSize Setup the WSABUF and WSAOVERLAPPED structures wsabuf buf char pBuf wsabuf len dwBufSize memset over hEvent m hEventSock dwFlags 0 fPending FALSE int sizeAddr sizeof sockaddr in nRet WSARecvFrom m Socket Socket Completion function if nRet 0 if WSAGetLastError WSA IO PENDING return FALSE else fPending TRUE If the I O isn t finished if fPending Wait for the request to complete or the exit event hEvents 0 over hEvent hEvents 1 m hEventExit 14 dwRet WaitForMultipleObjects 2 hEvents FALSE INFINITE Was the recv event signaled if dwRet 0 return FALSE if WSAGetOverlappedResult m Socket Recv event is complete keep statistics m translate dwRecv return TRUE 数据处理部分 BOOL CUdpSock DelWithResData struct sockaddr FAR lpFrom 15 DWORD lenPag sizeof PackHead DWORD start 0 DWORD onePagLeft 0 SockPags pags if m bFillHead onePagLeft m PackHead len lenPag if m SimpleIOBuffer GetBufferLen onePagLeft TRACE There is no enough packege length 1 n return FALSE ASSERT onePagLeft Excute m bFillHead FALSE DelWithResData lpFrom 16 delete pags buff else while m SimpleIOBuffer Read char m bFillHead FALSE TRACE There is packege2 is erro n return FALSE m bFillHead TRUE onePagLeft m PackHead len lenPag if m SimpleIOBuffer GetBufferLen onePagLeft TRACE There is no enough packege length 2 n return FALSE ASSERT onePagLeft Excute m bFillHead FALSE delete pags buff return TRUE 处理部分如下 void CUdpSock OnRead m translate 0 sockaddr in addrfro memset addrfro sin family AF INET if RecvRequest LPBYTE m wsaInBuffer buf sizeof m byInBuffer sockaddr return 18 if m translate m SimpleIOBuffer Write m wsaInBuffer buf m translate try DelWithResData sockaddr catch TRACE Udp DelWithResData erro n memset m bFillHead FALSE m SimpleIOBuffer Notify return 19 心得体会心得体会 一周的课程设计转瞬而逝 在这段有限的时间里 我真正领悟到了编程 的乐趣并积极参与到里面 从更深的层面了解到了网络编程的意义 本次课程设计围绕 UDP 服务器的设计而开展 是以 C S 模式进行的工作 涉及到 Winsock 编程 还要用到 Winsock API 函数 开始的时候 我并没有 多少头绪 因为在以前的学习中只注重了理论基础方面的积累 而实践方面 并未有多少加强 不过我有信心做好这一项课设

温馨提示

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

评论

0/150

提交评论