UDP通信与IO模型
recvfrom(接受数据并获取源地址)src_addr参数会自动填充发送方的ip和端口,这是实现“回射服务器”的基础。sendto(发送数据到指定地址)每次发送都需要指定目标地址dest_addr.设置setsockopt地址设置setsockopt。
·
一、UDP通信
1.核心函数原型
recvfrom(接受数据并获取源地址)
ssize_t recvfrom(int sockfd,void *buf,size_t len,int flags,struct sockaddr*src_addr,socklen_t*addrlen);
src_addr参数会自动填充发送方的ip和端口,这是实现“回射服务器”的基础。
sendto(发送数据到指定地址)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
每次发送都需要指定目标地址dest_addr.
2.三种通信模式
- 单播 :一对一。标准的客户端/服务器通信。
- 广播 :一对所有(局域网内)。
- 设置:需调用
setsockopt启用SO_BROADCAST选项。 - 地址:目标 IP 为
255.255.255.255(受限广播) 或子网定向广播地址。
- 设置:需调用
- 组播 :一对多(特定组)。
- 设置:发送端指定组播地址;接收端需调用
setsockopt加入组播组 (IP_ADD_MEMBERSHIP)。
- 设置:发送端指定组播地址;接收端需调用
二、 高性能IO模型
-
阻塞与非阻塞IO
- 阻塞IO:默认模式。
recv/send时,若无数据或缓冲区满,线程挂起等待。 - 非阻塞IO:通过
fcntl设置O_NONBLOCK。若操作不能立即完成,函数立刻返回错误 (EAGAIN/EWOULDBLOCK),需轮询尝试。
- 阻塞IO:默认模式。
-
IO多路复用 (I/O Multiplexing)
- 作用:单线程管理多个Socket连接,避免为每个连接创建线程/进程的开销。
select函数int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);- 缺点:监听文件描述符数量有限 (通常1024);每次调用需重新传入集合;存在用户态/内核态拷贝。
poll函数int poll(struct pollfd *fds, nfds_t nfds, int timeout);- 优点:基于链表存储,无最大连接数限制;
pollfd结构体包含events(关注事件) 和revents(实际发生事件)。 - 常用事件宏:
POLLIN:可读POLLOUT:可写POLLERR:错误POLLHUP:挂起
三、 并发服务器模型
-
多进程并发模型 (fork)
- 原理:父进程负责
accept,子进程负责recv/send。 - 资源释放:子进程退出后需防止僵尸进程 (使用
signal(SIGCHLD, handler)或waitpid)。 - 优化:预创建进程池 (Pre-forking),避免频繁创建销毁进程的开销。
- 原理:父进程负责
-
多线程并发模型 (pthread)
- 原理:主线程监听,新连接创建新线程处理。
- 注意:线程间共享数据需加锁 (互斥量),且一个线程崩溃可能导致整个进程崩溃。
-
IO多路复用模型 (Select/Poll)
- 原理:单线程循环调用
select/poll,检测所有 Socket 状态。 - 流程:
- 将监听 Socket 加入集合。
select返回就绪的描述符。- 遍历集合,若是监听 Socket 则
accept,若是通信 Socket 则recv/send。
- 原理:单线程循环调用
| 函数名 | 所属模型 | 核心作用 | 关键参数/标志 |
|---|---|---|---|
recvfrom |
UDP | 接收数据并获取源地址 | src_addr (输出参数,获取发送方信息) |
sendto |
UDP | 发送数据到指定地址 | dest_addr (指定目标 IP/Port) |
setsockopt |
UDP | 设置套接字选项 | SO_BROADCAST (广播), IP_ADD_MEMBERSHIP (组播) |
select |
IO多路复用 | 监视多个文件描述符状态 | fd_set 集合, timeout (超时时间) |
poll |
IO多路复用 | 监视多个文件描述符状态 | struct pollfd (包含 events/revents), nfds |
fork |
进程 | 创建子进程 | 子进程返回 0,父进程返回子进程 PID |
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)