UDP网络编程
内容
一、概述
二、基本UDP编程
三、UDP广播
Udp编程主要用到的函数 socket() bind() sendto() recvfrom() close()
一、概述
1. UDP协议
UDP是面向无连接的用户数据报协议,在传输数前不需要先建立连接。
目地主机的运输层收到UDP报文后,不需要给出任何确认
2. UDP协议与TCP协议的差异
|
TCP |
UDP |
是否面向连接 |
是 |
否 |
是否可靠 |
是 |
否 |
是否广播 |
否 |
是 |
效率 |
低 |
高 |
3.如何在TCP和UDP之间取舍
1)广播和多播应用必须使用UDP
2)简单的请求-应答应用程序可以使用UDP
3)对于海量数据传输不应该使用UDP
4.UDP的使用场合
DNS、NFS、流媒体传输等等
二、基本UDP编程
客户端服务端通信例子
1.ssize_t recvfrom(int sockfd, void*buf,size_t nbytes,int flags,
struct sockaddr* from, socklen_t *addrlen);
功能:
用于接收数据
参数:
sockfd:套接字
buf: 接收数据缓冲区
nbytes:接收数据缓冲区的大小
flags: 套接字标志(常为0)
from: 用于存放发送方信息的地址结构体指针
addrlen: from所指内容的长度
注意:
struct sockaddr *from, socklen_t *addrlen
类似于accept函数的最后两个参数
通过from和addrlen参数存放数据来源
可以为NULL, 表示不关心数据来源
返回值:
成功:接收到的字符数
失败: -1
2.ssize_t sendto(int sockfd,const void* buf, size_t nbytes,int flags,
const struct sockaddr *to,socklen_t addrlen);
功能:
用于发送数据
参数:
sockfd:套接字
buf:发送数据缓冲区
nbytes:发送数据缓冲区的大小
flags:一般为0
to:指向目的主机地址结构体的指针
addrlen:to所指向内容的长度
注意:
const struct sockaddr *to,socklen_t addrlen
类似于connect函数的最后两个参数
通过to和addrlen确定目的地址
发送一个0长度的UDP数据包是可行的
返回值:
成功:发送的字符数
失败: -1
三、UDP广播
1. UDP广播概述
1) 广播:由一台主机向该主机所在子网内的所有主机发送数据的方式
2) 广播只能用UDP或原始IP实现,不能用TCP
3) 广播的用途
单个服务器与多个客户主机通信时减少分组流通
址解析协议(ARP)
动态主机配置协议(DHCP)
网络时间协议(NTP)
2. 广播地址
1) {子网ID,主机ID}
子网ID表示由子网掩码中1覆盖的连续位
主机ID表示由子网掩码中0覆盖的连续位
2) 子网定向广播地址:主机ID全1
例如:对于192.168.220.0/24子网,192.168.220.255即为其定向广播地址
通常路由器不转发该广播
3) 受限广播地址:255.255.255.255
路由器从不转发该广播
通常在DHCP等应用中把该地址当做宿主地址,因为此时客户主机还不知道所处子网的信息
3. UDP广播的特点
处于同一子网的所有主机都必须处理数据
UDP数据包会沿协议栈向上一直到UDP层
运行音视频等较高速率工作的应用,会带来大负
局限于局域网内使用
3. UDP广播的特点
处于同一子网的所有主机都必须处理数据
UDP数据包会沿协议栈向上一直到UDP层
运行音视频等较高速率工作的应用,会带来大负荷
局限于局域网内使用
4. 套接口选项
int setsockopt(int sockfd, int level,int optname,const void *optval, socklen_t optlen);
成功执行返回0,否则返回-1
广播例子: