1. 为什么选择UDP进行网络编程
在Linux系统编程中,UDP(用户数据报协议)与TCP(传输控制协议)是两种最常用的传输层协议。与TCP相比,UDP具有几个显著特点:
- 无连接性:不需要建立连接即可发送数据
- 轻量级:头部开销小(仅8字节)
- 不可靠传输:不保证数据顺序和到达
- 高效率:没有拥塞控制和重传机制
这些特性使UDP特别适合以下场景:
- 实时性要求高的应用(如视频会议、在线游戏)
- 简单的请求-响应模型
- 广播/多播通信
- 对丢包不敏感但要求低延迟的场景
提示:当需要可靠传输时,通常会在应用层实现确认和重传机制,而不是直接选择TCP
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. UDP编程基础概念
2.1 Socket基础
在Linux中,Socket是网络通信的端点,通过文件描述符进行操作。创建UDP socket的基本流程:
c复制#include <sys/types.h>
#include <sys/socket.h>
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 地址结构体
UDP使用sockaddr_in结构体表示网络地址:
c复制struct sockaddr_in {
sa_family_t sin_family; // 地址族(AF_INET)
in_port_t sin_port; // 端口号(网络字节序)
struct in_addr sin_addr; // IP地址
};
struct in_addr {
uint32_t s_addr; // 32位IP地址(网络字节序)
};
2.3 字节序转换
网络编程中必须注意主机字节序和网络字节序的转换:
c复制#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong); // 主机到网络(长整型)
uint16_t htons(uint16_t hostshort); // 主机到网络(短整型)
uint32_t ntohl(uint32_t netlong); // 网络到主机(长整型)
uint16_t ntohs(uint16_t netshort); // 网络到主机(短整型)
