Socket阻塞与非阻塞模式详解:从原理到高并发实战

突破编程_C++_网络编程(Windows 套接字(阻塞模式与非阻塞模式)) C++ 网络编程:Windows 套接字(阻塞模式与非阻塞模式) 阅读详情

1. 从一次深夜告警说起:为什么你的服务突然“卡死”了?

凌晨两点,手机突然开始疯狂震动。监控系统显示,一个核心的订单处理服务响应时间飙升到了30秒以上,大量请求超时,用户界面直接卡死。登录服务器一看,CPU和内存都还健康,但网络连接数却异常地高。紧急排查日志,发现了一堆类似 get value from agent failed: cannot read response: cannot read from socket: 的错误。问题的根源,最终指向了一个看似基础,却常常被忽视的设定: socket的阻塞模式 。那个负责与下游服务通信的模块,在某个网络波动导致对端响应变慢时,它的socket正傻傻地“阻塞”在原地,等待一个可能永远不会到来的数据包,从而拖垮了整个线程池。

这个场景,几乎是每一个后端开发者职业生涯中迟早会遇到的“必修课”。无论是你刚接触网络编程时写的第一个聊天室,还是如今维护的分布式微服务,底层的数据交换都绕不开socket。而理解socket的 阻塞(Blocking) 与**非阻塞(Non-blocking)**模式,就是掌握网络编程命脉的第一步。这不仅仅是两个简单的API调用选项,它们背后代表了两种截然不同的程序执行哲学和资源调度模型,直接决定了你服务的吞吐量、响应速度和健壮性。

简单来说,你可以把阻塞模式想象成你去银行柜台办业务:你取了一个号,然后就必须坐在那里干等,直到柜员叫到你的号码。在这期间,你什么也做不了。而非阻塞模式,则像是你通过手机APP预约了业务,提交申请后,APP会告诉你“正在处理”,然后你就可以去干别的事情,时不时刷新一下看看结果。当处理完成时,APP会通知你。

在网络编程中,这个“柜台”或“APP”,就是socket。选择哪种模式,没有绝对的好坏,只有是否适合当前的场景。本文将彻底拆解这两种模式的工作原理、适用场景、核心API差异以及那些在官方文档里不会写的“坑”。我们会从最基础的socket调用开始,一直深入到多路复用(I/O Multiplexing)如何与非阻塞socket协同工作,帮你构建起清晰的认知框架,让你下次再看到 socket error 或 bind: only one usage of each socket 这类错误时,能立刻知道该从哪里入手。

2. 阻塞模式:简单直白,但也是性能的“单点瓶颈”

阻塞模式是socket的默认行为,也是最符合人类直觉的编程模型。它的核心逻辑就是“等待”:当你的程序调用一个网络I/O操作(如 accept() , connect() , recv() , send() )时,如果所需的条件没有立即就绪,操作系统内核会让调用线程进入睡眠状态,直到这个操作完成或发生错误。在此期间,这个线程会被挂起,不消耗CPU时间片,但也无法执行任何其他任务。

2.1 阻塞模式下的典型操作流程

让我们以一个经典的TCP服务器为例,看看阻塞模式下代码是如何“一步一步”执行的。

服务器端伪代码流程:

  1. socket() : 创建一个监听socket。这一步通常立刻返回。
  2. bind() : 绑定IP和端口。如果端口被占用(比如遇到 error: only one usage of each socket address 错误),则立即失败。
  3. listen() : 开始监听。立刻返回。
  4. accept() : 这是一个关键的阻塞点 。调用后,线程会停在这里,直到有新的客户端连接到来。此时,线程完全被“冻住”。
  5. 当 accept() 返回一个新的连接socket后,通常会创建一个新线程或使用线程池来处理这个连接。
  6. 在新线程中,对连接socket调用 recv() : 这是另一个核心阻塞点 。线程会停在这里,等待客户端发送数据过来。如果客户端迟迟不发,线程就永远等下去。
  7. 处理数据,然后调用 send() 回复。 send() 在发送缓冲区满时也会阻塞,直到有空间容纳要发送的数据。
  8. 关闭socket。

客户端伪代码流程类似:

  1. socket() : 创建socket。
  2. connect() : 阻塞点 。发起连接,线程等待直到与服务器完成三次握手或超时。
  3. send()/recv() : 进行数据收发,同样会阻塞。

这种模式的代码写起来非常清晰,逻辑是线性的,就像读一本小说一样从上到下。对于并发连接数很少(比如传统的桌面应用、简单的工具脚本)的场景,它完全够用。Unity网络编程基础教程里,为了简化概念,也常常从阻塞模式教起。

2.2 阻塞模式的致命陷阱与资源挑战

然而,一旦将阻塞模式应用于需要高并发的服务器端,它的缺点就会暴露无遗。最大的问题就是 “一个连接,一个线程” 的模型所带来的巨大开销。

  • 线程资源消耗 :每一个被阻塞的 accept() 或 recv() 都需要一个独立的线程来承载。操作系统创建和维护线程是有成本的,包括内存(每个线程都有独立的栈空间,通常是几MB)和上下文切换的开销。当连接数上升到几百甚至几千时,成百上千的线程会迅速榨干系统资源。你可能会遇到 ollama e
【服务器系统设计】socket的阻塞模式和非阻塞模式总结 前言 对socket在阻塞和非阻塞模式下各个socket函数的表现进行深入理解,是掌握网络编程的基本要求之一,也是重点和难点。 在阻塞和非阻塞模式下,我们常常讨论的具有不同行为表现的socket函数一般有connect,accept,send和recv。 定义 阻塞模式:指的是当某个函数执行成功的条件当前不满足时,该函数会阻塞当前执行线程,程序执行流在超时时间到达或执行成功的条件满足后恢复继续执行。 非阻塞模式:即使某个函数执行成功的条件不满足,该函数也不会阻塞当前执行线程,而是立即返回,继续执行程序流。 阅读详情

相关推荐

Socket -- 阻塞模式

(1)阻塞模式   Windows套接字在阻塞和非阻塞两种模式下执行I/O操作。在阻塞模式下,在I/O操作完成前,执行的操作函数一直等候而不会立即返回,该 函数所在的线程会阻塞在这里。相反,在非阻塞模式下,套接字函数会立即返回,而不管I/O是否完成,该函数所在的线程会继续运行。在阻塞模式的套接字上,调用任何一个Windows Sockets API都会耗费不确定的等待时间。图所示,在调用

q_023的博客 1148

阻塞模式Socket详解:Windows平台实践指南

Windows Sockets API,简称Winsock,是微软提供的一个基于TCP/IP协议的网络编程接口。它为程序员提供了一系列的函数,使得开发者可以在Windows平台上实现网络通信。Winsock有两种主要的版本,1.x和2.x。Winsock 2.x引入了对异步操作和扩展协议的支持,并兼容Winsock 1.x。在进行Socket编程时,通常首先需要初始化Winsock,加载Winsock库,然后创建一个Socket,之后可以进行连接、数据传输等操作。

weixin_42561464的博客 545

深入理解Socket阻塞与非阻塞模式下的IO操作特性

阻塞模式是网络编程中最基本的IO操作模式。在这种模式下,当一个应用进程对某个IO进行操作时,该进程将被阻塞直到操作完成。这种模式适用于数据量不大、实时性要求较高的场景,比如简单的客户端-服务器模型,其中客户端发送请求,服务器接收请求并立即响应。在此模式下,应用程序不会从一个read或write系统调用返回,直到有某些事情发生。例如,在服务器端,当read操作正在等待客户端连接时,它将阻塞。一旦有客户端发起连接,阻塞解除,服务器继续执行操作。

weixin_33481022的博客 1038

学习利用ce修改游戏生命参数

易语言代码 游戏的简陋界面 用ce查找存储这个1000即生命值的内存地址(得先附加到目标程序上,点击左上角那个电脑按钮) 看到有很多值为1000的,但哪个是生命值呢?真相只有一个 我们点击一下打我这个按钮,看下面的ce界面上地址为004A65C0处的值变了,所以这个就是我们要找的生命值 接下来我们对生命值进行修改,修改为99

zsd747289639的博客 5万+

SystemVerilog实战:AXI Stream协议从零搭建(附完整代码解析)

本文详细介绍了如何使用SystemVerilog从零搭建AXI Stream协议,包括核心信号解析、接口设计、主从设备实现及验证环境构建。通过完整的代码示例和工程实践技巧,帮助开发者掌握AXI Stream在FPGA/ASIC设计中的高效数据传输方法,特别适合视频处理和网络数据传输等应用场景。

weixin_29207439的博客 360

Visionpro 使用CogPMAlignTool工具提取匹配轮廓点

【代码】Visionpro 使用CogPMAlignTool工具提取匹配轮廓点。

weixin_43947315的博客 2091

基于STM32-XPC仿真平台的构架

基于STM32-XPC仿真平台的构架 xPC Target是MathWorks公司的MATLAB提供的一个基于RTW(Real-Time Workshop)体系框架的附加产品,是一种用于产品原型开发、测试和配置实时系统的PC机解决途径。xPC目标实时仿真系统能够使开发者在产品开发前进行产品原型的快速实现、测试和评估,是 Simulink 工具集下用于产品原型开发设计测试集于一体的工具箱。

sujianbonwpu的博客 4487

ShaderJoy —— 简单又神奇的 “合体” 函数【GLSL】

smin 函数 它实际上有两种常见的实现方式 多项式 指数 多项式 smin 函数图 其对应的代码为 float smin( float a, float b ) { // 多项式 const float k = 0.5; float h = clamp(0.5 + 0.5 * (b - a) / k, 0.0, 1.0); return mix(b, a, h) - k * h * (1.0 - h); } 从上图中我们可以很明显的看出有两处不连...

ShaderJoy 的兴趣技术杂货铺 1857

YOLO26跨时代升级!YOLO26 MLCA注意力机制解读

摘要: 本文提出了一种基于多级上下文聚合(MLCA)注意力机制的改进卷积神经网络。MLCA模块通过局部和全局注意力机制动态调整特征图权重,结合了ECA注意力与自适应池化,显著提升特征表达能力。实验表明,添加MLCA后模型mAP提升12.11,准确率提高5.43。文中详细解析了MLCA1模块的工作原理,包括局部/全局池化、卷积操作和注意力加权机制,并介绍了集成MLCA的Bottleneck_MLCA模块。该机制通过多层次特征融合,在保持计算效率的同时增强模型对关键特征的敏感性。最后提供了YOLOv26-MLC

m0_71589036的博客 283

强化学习(Reinforcement Learning)与动态系统控制方法

一个具体的 RBC 的例子是自动驾驶汽车中的交通规则。在训练过程中,代理通过与环境交互获取奖励信号,并学习如何在某个状态下采取最佳的行动,以最大化长期的累积奖励。在化工过程中,通过对生产过程中的温度、压力、流量等参数的控制来实现产品的质量和产量的提高。需要注意的是,以上代码只是一个简单的示例,实际的 MPC 系统可能会更加复杂,并包含更多的模型预测和控制算法来实现更复杂的控制任务。需要注意的是,以上代码只是一个简单的示例,实际的自动驾驶汽车系统可能会更加复杂,并包含更多的规则和条件来确保安全行驶。

AI天才研究院 4062

黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)

erase命令单位是擦除组,那么一个擦出组包含多个写块,不同写块有不同信息,主机擦除之前,必须进行确定好这些写块中的信息没有用了。所以通常erase用来擦除整个设备或分区。erase完成后,将erase的区域都要么是全0,要么是全1。那么到底是0还是1呢,根据不同的工艺有所不同,但是别担心,在ecsd[181]中会有说明到底是1还是0。erase命令的作用就是简单的将映射地址范围移动到未映射的地址范围。

黑猫奥利奥的博客 7797

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: AE 3D 图层核心应用:零基础实现 2D 元素立体化与动态视觉升级
下一篇: 构建智能代码门禁:从自动化检查到AI原生架构实践
cuixie2370
博客等级 码龄10年 16粉丝 842原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值