实验二 UDP 通信实验

一、实验目的
进一步理解 Winsock API 的调用方法。
了解 UDP 协议的工作原理。
掌握 UDP 服务端程序和客户端程序的编写流程。
熟悉程序的调试方法。
二、实验设计
1、背景知识 
Winsock 编程模型 Winsock 编程的主要模型分为流套接字编程模型和数据报套接字编程模型两类,主要区别在于:前者提供双向的、有序的、无重复并且无记录边界的数据流服务,即采用有连接的 数据传输服务,保证数据可靠到达;后者也支持双向数据流,但不能保证数据的可靠、有序和无重复,它保留了记录边界,是一种无连接、不可靠的数据传输模型。
数据报套接字编程模型
数据报套接字使用 UDP 协议进行数据的传输,是一种无连接的数据传输模型,编程过程相对简单,采用客户/服务器(C/S)结构进行设计。
在数据报套接字编程模型中,客户端发送数据(也称发送端),服务器端接收数据(也称接收端)。实际上,由于数据报套接字编程模型也支持双向数据传递,因此,服务器端和客户端的概念已经比较模糊。为了说明数据报套接字编程模型的工作原理,这里仍然沿用这两个概念。
数据报套接字的服务进程和客户进程不需要在通信前建立连接,仅需要创建各自的套接 字,因此程序设计过程相当简单,简述如下:
接收端:(1)、创建数据报套接字;(2)、绑定本机地址和端口;(3)、等候接收数据;(4)、使用 完成后关闭套接字。
发送端:(1)、创建数据报套接字;(2)、向指定地址和端口发送数据;(3)、使用完成后关闭套接字。
数据报套接字编程使用的函数
(1) 创建套接字函数 socket() SOCKET socket(int af,int type,int protocol); 
由于采用数据报套接字进行数据传输,因此 type 参数必须设置为 SOCK_DGRAM, protocol 参数必须设置为 IPPROTO_UDP 
(2) 绑定本地地址到所创建的套接字函数 bind()
int bind(SOCKET s,const struct sockaddr* name,int namelen);
在实际编程时可以省略该函数,系统会自动绑定 
(3) 接收数据函数 recvfrom() 
int recvfrom(SOCKET s,char* buf,int len,int flags, struct sockaddr* from,int* fromlen); 
(4) 发送数据函数 sendto() 
int sendto(SOCKET s,const char* buf,int len,int flags, const struct sockaddr* to,int* tolen); 
(5) 关闭套接字函数 closesocket() 
int closesocket(SOCKET s);
数据报套接字编程模型时序和流程

为便于理解数据报套接字模型下的编程过程,用时序图表述如下(请注意,时序图不同 于程序流程图,它只是对完成一次通信过程进行原理性描述的手段。

实验二 UDP 通信实验_第1张图片

2、实验内容 
(1)、认真理解数据报套接字编程模型,仔细阅读并调试运行 UDPserve.cpp 程序和 UTPClient.cpp 程序源代码,分析在服务端和客户端分别使用了哪些 Winsock API 函数,写 入实验报告; 
(2)、修改 UDPServer 和 UDPClient 程序,设计一个简单的 UDP 通信程序,并达到以下要 求: 
a.双方能相互发送数据,并显示接收到的数据。
b.当收到对方的数据为“bye”时,能退出程序。
c.编程验证实验思考题中问题。
d.选做,服务器同多个客户端通信。
三、实验过程(包含实验结果)
1、运行服务器和客户端程序

实验二 UDP 通信实验_第2张图片实验二 UDP 通信实验_第3张图片

 

 

你可能感兴趣的:(Windows网络编程)