socket阻塞和非阻塞的区别是什么

时间:2025-06-10

Socket 的阻塞(Blocking)和非阻塞(NON-blocking)模式是网络编程中两种重要的 I/O 操作方式,主要区别在于程序在等待 I/O 操作完成时的行为。以下是它们的区别:

1. 阻塞模式(Blocking)

特点

常见阻塞操作

示例(TCP 阻塞 recv)

c

char buffer[1024]; int bytes = recv(sockfd, buffer, sizeof(buffer), 0); // 阻塞,直到收到数据或出错 printf("Received: %d bytes\n", bytes);

优点

缺点


2. 非阻塞模式(Non-blocking)

特点

如何设置非阻塞 Socket?

在 Linux 下:

c

int flags = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, flags | O_NONBLOCK); // 设置为非阻塞

在 Windows 下:

c

unsigned long mode = 1; ioctlsocket(sockfd, FIONBIO, &mode); // 设置为非阻塞

常见非阻塞操作

示例(非阻塞 recv + 轮询)

c

char buffer[1024]; int bytes = recv(sockfd, buffer, sizeof(buffer), 0); if (bytes == -1) {
    if (errno == EWOULDBLOCK) {
        printf("No data available, try later.\n");
    } else {
        perror("recv error");
    } } else {
    printf("Received: %d bytes\n", bytes); }

优点

缺点

3. 对比总结

特性阻塞模式非阻塞模式
调用行为等待操作完成才返回立即返回,成功/失败需检查
线程状态挂起,不占用 CPU继续执行,可处理其他任务
并发能力低(需多线程)高(单线程 + I/O 多路复用)
编程复杂度简单较复杂(需处理异步状态)
适用场景简单客户端、低并发服务器高并发服务器(Web、游戏、实时系统)

4. 如何选择?

5. 扩展:I/O 多路复用(select/poll/epoll)

非阻塞 Socket 通常结合 I/O 多路复用 使用,避免忙轮询:

示例(epoll + 非阻塞 Socket)

c

int epfd = epoll_create1(0); struct epoll_event ev;
ev.events = EPOLLIN | EPOLLET; // 边缘触发(Edge-Triggered)
ev.data.fd = sockfd; epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &ev);
 while (1) {
    int n = epoll_wait(epfd, events, MAX_EVENTS, -1);
    for (int i = 0; i < n; i++) {
        if (events[i].data.fd == sockfd) {
            // 有数据可读,调用 recv(不会阻塞)
            recv(sockfd, buf, sizeof(buf), 0);
        }
    } }

总结

上一篇:NTC负温度系数温度传感器工作原理
下一篇:漏电保护开关的工作原理、接线方法及注意事项

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料