一、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模型
  1. 阻塞与非阻塞IO

    • 阻塞IO:默认模式。recv/send 时,若无数据或缓冲区满,线程挂起等待。
    • 非阻塞IO:通过 fcntl 设置 O_NONBLOCK。若操作不能立即完成,函数立刻返回错误 (EAGAIN/EWOULDBLOCK),需轮询尝试。
  2. 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:挂起
三、 并发服务器模型
  1. 多进程并发模型 (fork)

    • 原理:父进程负责 accept,子进程负责 recv/send
    • 资源释放:子进程退出后需防止僵尸进程 (使用 signal(SIGCHLD, handler) 或 waitpid)。
    • 优化预创建进程池 (Pre-forking),避免频繁创建销毁进程的开销。
  2. 多线程并发模型 (pthread)

    • 原理:主线程监听,新连接创建新线程处理。
    • 注意:线程间共享数据需加锁 (互斥量),且一个线程崩溃可能导致整个进程崩溃。
  3. IO多路复用模型 (Select/Poll)

    • 原理:单线程循环调用 select/poll,检测所有 Socket 状态。
    • 流程
      1. 将监听 Socket 加入集合。
      2. select 返回就绪的描述符。
      3. 遍历集合,若是监听 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
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐