1. 为什么选择UDP协议进行网络通信
在Linux环境下实现网络通信时,TCP和UDP是最常用的两种传输层协议。与TCP相比,UDP具有几个显著特点:
- 无连接特性:不需要建立和断开连接的过程
- 更低的协议开销:没有确认、重传等机制
- 更小的头部开销:UDP头部只有8字节
- 支持广播和多播
这些特性使得UDP特别适合以下场景:
- 实时性要求高的应用(如视频会议、在线游戏)
- 简单的请求/响应模型
- 需要广播或多播的应用
- 能容忍少量丢包但对延迟敏感的场景
注意:UDP不保证数据包的顺序和可靠性,应用层需要自行处理这些问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Linux C UDP通信核心实现步骤
2.1 创建UDP套接字
在Linux系统中,使用socket()系统调用创建UDP套接字:
c复制int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (sockfd < 0) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}
参数说明:
- AF_INET:IPv4地址族
- SOCK_DGRAM:指定数据报套接字类型(UDP)
- 0:自动选择协议(IPPROTO_UDP)
2.2 绑定地址和端口(服务端)
服务端需要绑定到特定端口以接收数据:
c复制struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = INADDR_ANY; // 接收任意IP的连接
servaddr.sin_port = htons(PORT); // 端口号
if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
2.3 发送和接收数据
UDP通信的基本函数是sendto()和recvfrom():
发送数据示例:
c复制struct sockaddr_in cliaddr;
memset(&cliaddr, 0, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(PORT);
inet_pton(AF_INET, "127.0.0.1", &cliaddr.sin_addr);
char *hello = "Hello from client";
sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *)&cliaddr,
sizeof(cliaddr));
接收数据示例:
c复制char buffe
