实验二 UDP 通信实验
通信模型:
1 实验类型
验证型实验
2 实验目的
1. 进一步理解Winsock API 的调用方法
2. 了解UDP 协议的工作原理
3. 掌握UDP 服务端程序和客户端程序的编写流程
4. 熟悉程序的调试方法。
3 背景知识
1. Winsock 编程模型
Winsock 编程的主要模型分为流套接字编程模型和数据报套接字编程模型两类,主要区
别在于:前者提供双向的、有序的、无重复并且无记录边界的数据流服务,即采用有连接的
数据传输服务,保证数据可靠到达;后者也支持双向数据流,但不能保证数据的可靠、有序
和无重复,它保留了记录边界,是一种无连接、不可靠的数据传输模型。
2. 数据报套接字编程模型
数据报套接字使用UDP 协议进行数据的传输,是一种无连接的数据传输模型,编程过程
相对简单,采用客户/服务器(C/S)结构进行设计。
在数据报套接字编程模型中,客户端发送数据(也称发送端),服务器端接收数据(也
称接收端)。实际上,由于数据报套接字编程模型也支持双向数据传递,因此,服务器端和
客户端的概念已经比较模糊。为了说明数据报套接字编程模型的工作原理,这里仍然沿用这
两个概念。
数据报套接字的服务进程和客户进程不需要在通信前建立连接,仅需要创建各自的套接
字,因此程序设计过程相当简单,简述如下:
接收端:1、创建数据报套接字;2、绑定本机地址和端口;3、等候接收数据;4、使用
完成后关闭套接字。
发送端:1、创建数据报套接字;2、向指定地址和端口发送数据;3、使用完成后关闭
套接字。
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);
1. 数据报套接字编程模型时序和流程
为便于理解数据报套接字模型下的编程过程,用时序图表述如下(请注意,时序图不同于程序流程图,它只是对完成一次通信过程进行原理性描述的手段。
4 实验内容
1、认真理解数据报套接字编程模型,仔细阅读并调试运行UDPserve.cp