github仓库:https://github.com/brucewayne9064/LinuxCpp_server

UDP是无连接的不可靠的数据报协议,优点在于开销小(不用建立连接和撤销连接),速度快,缺点在于数据可能丢失

一、UDP套接字编程的基本步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
graph LR
subgraph 客户端
A[创建套接字] --> B[设置地址和端口]
B --> C[发送数据]
C --> D[接收数据]
D --> E{是否结束?}
E -->|是| F[关闭套接字]
E -->|否| C
end

subgraph 服务器端
G[创建套接字] --> H[设置地址和端口]
H --> I[绑定端口]
I --> J[接收数据]
J --> K[发送数据]
K --> L{是否结束?}
L -->|是| M[关闭套接字]
L -->|否| J
end

C -.-> J
K -.-> D

服务器:

  • 创建socket
  • bind地址
  • 从套接字recvfrom客户端请求,得到客户端地址
  • sendto信息给客户端
  • 循环或者关闭

客户端:

  • 创建socket
  • sendto信息给服务器
  • 从套接字recvfrom服务器应答
  • 循环或者关闭

二、UDP套接字编程的相关函数

  • sendto
  • recvfrom

三、实战UDP套接字

四、UDP丢包以及无须问题

丢包:服务器的socket接收缓存满了,系统丢弃后来的包;或服务器处理收到的包的时间内没有接收新的包

  • 在服务器单独开一个线程接收UDP包,放在单独缓冲区,用其他线程处理数据
  • 减慢客户端发送速度,比如增加sleep时间

更好的解决办法:

  • 模拟TCP
  • 重发请求(ARQ)协议:连续ARQ,选择重发ARQ,滑动窗口
  • 自己实现确认重传