UDP套接字编程基础
一、了解套接字编程
网络通信程序的编写(UDP、TCP)
(一)网络通信是两端主机之间的通信:C/S
- 客户端-Client:主动发起请求的一端。
- 服务端-Server:被动接受请求,提供服务的一端。
(二)两种协议的网络通信程序编写差异
因为传输层协议(UDP/TCP)特性有所不同,因此通信流程也有所不同:
1.UDP协议
用户数据报协议-无连接,不可靠,面向数据报的传输协议;
因为不需要实现可靠传输,因此传输性能较高;
因此适用于性能要求大于安全要求的场景—视频数据传输。
2.TCP协议
传输控制协议-面向连接,可靠传输,面向字节流的传输协议;
实现了可靠传输,因此传输安全性较高;
因此适用于安全性要求大于性能要求的场景—文件传输
(三)UDP如何实现可靠传输?
UDP在传输层没有实现可靠有序传输,
如果要实现可靠传输则需要程序员在应用层进行处理:
- 包序管理:给每一个数据报进行编号。
- 丢包检测重传:确认应答机制+超时重传机制。
二、UDP协议
用户数据报协议-无连接,不可靠,面向数据报的传输协议。
(一)实现协议格式
16位源端端口+16位对端端口+16位数据报长度+16校检和。
1.UDP协议特性理解
(1)无连接
udp通信不需要建立连接,只要知道对端地址就可以发送数据。
(2)不可靠
没有丢包检测机制,不保证数据有序安全到达对端(丢了就没了)。
(3)面向数据报
无连接不可靠,有最大长度限制的传输方式,并且数据报整条交付。
三、UDP通信操作流程
(一)接口认识
1.创建套接字
int socker(int domain, int type, int protocol);//AF_INET,SOCK_DGRAM, IPPROTO_UDP
2.绑定地址信息
int bind(int sockfd, struct sockaddr *addr,socklen_len);
struct sockaddr是函数通用结构类型,实际上在IPV4通信时需要使用struct sockaddr_in结构
3.发送数据
ssize_t sendto(int sockfd, void *data, int len, int flag,struct sockaddr *addr,socklen_t addrlen);
4.接收数据
ssize_t recvfrom(int sockfd, void *buf, int len, int flag,struct sockaddr *addr,socklen_t addrlen);
5.关闭套接字
int close(int fd);
(二)字节序转换
因为主机字节序会导致不同主机在网络传输时造成数据二义性,因此网络传输的数据必须使用网络字节序。
uint16_t htons(uint16_t hostshort);
uint16_t ntohs(uint16_t netshort);
uint16_t htonl(uint32_t hostlong);
uint16_t ntohl(uint32_t netlong);
id_addr_t inet_addr(const char *ip);
const char *inet_ntoa(struct in_addr sin_addr);
(三)UDP编程注意事项
1. 端口数据的转换不能使用htonl/ntohl。
2. udp传输保证安全有序,因此需要程序员在应用层进行包序管理以及安全管理。
3. udp传输报文最大长度限制64k,其中数据长度限制64k-8,因此若发送数据过长需要程序员在应用层进行分包。
4. udp传输整条交付,不会出现半条或多条,因此接收数据时给的缓冲区要足够大。