UDP套接字编程基础


一、了解套接字编程

网络通信程序的编写(UDP、TCP)

(一)网络通信是两端主机之间的通信:C/S

  • 客户端-Client:主动发起请求的一端。
  • 服务端-Server:被动接受请求,提供服务的一端。

(二)两种协议的网络通信程序编写差异

因为传输层协议(UDP/TCP)特性有所不同,因此通信流程也有所不同:

1.UDP协议

用户数据报协议-无连接,不可靠,面向数据报的传输协议;
因为不需要实现可靠传输,因此传输性能较高
因此适用于性能要求大于安全要求的场景—视频数据传输。

2.TCP协议

传输控制协议-面向连接,可靠传输,面向字节流的传输协议;
实现了可靠传输,因此传输安全性较高
因此适用于安全性要求大于性能要求的场景—文件传输

(三)UDP如何实现可靠传输?

UDP在传输层没有实现可靠有序传输,
如果要实现可靠传输则需要程序员在应用层进行处理:

  1. 包序管理:给每一个数据报进行编号。
  2. 丢包检测重传:确认应答机制+超时重传机制。

二、UDP协议

用户数据报协议-无连接,不可靠,面向数据报的传输协议。

(一)实现协议格式

16位源端端口+16位对端端口+16位数据报长度+16校检和。

1.UDP协议特性理解

(1)无连接

udp通信不需要建立连接,只要知道对端地址就可以发送数据。

(2)不可靠

没有丢包检测机制,不保证数据有序安全到达对端(丢了就没了)。

(3)面向数据报

无连接不可靠,有最大长度限制的传输方式,并且数据报整条交付。

三、UDP通信操作流程

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传输整条交付,不会出现半条或多条,因此接收数据时给的缓冲区要足够大。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值