标签: network
与该标签相关的所有文章 "network".
-
C++ 协程:语言机制、陷阱与实现边界
C++20 协程的本质是编译器把带 coawait/coyield/coreturn 的函数重写成状态机,把跨 suspend 存活的变量打包到一个堆上的 frame——这是语言级 stackless 协程,不是 Goroutine 式 stackful。标准库只给了 coroutinehandle / suspendalways / suspendnever 这几块地基,不给 Task<T>、不给 Generator(C++23 才加)、不给 executor、不给调度器。要在网络服务器里用,必须自己实现 Task<T>(严格遵守 symmetric transfer 否则链式 coawait 直接栈溢出)+ IoUringAwaiter(绑定到 reactor)。三大杀手级陷阱:协程参数必须按值传(引用参数跨 suspend 必悬挂)、finalsuspend 必须 suspend_always(否则 double-free)、热路径不能依赖 HALO,需要自定义 operator new。
-
Linux I/O(二):io_uring 的双环模型与工程边界
iouring 的本质不是"更快的 epoll",而是用户态和内核态共享两个 mmap 环(SQ 提交环 / CQ 完成环)+ 完成模型(submit then wait for completion),统一覆盖文件 / socket / timer / futex 的异步。相较 epoll 的 readiness 模型,它在存储 I/O(libaio 无法 buffered)和syscall 密集场景(SQPOLL 下热路径零 syscall)有质变;对已优化过的 epoll 网络栈提升只有 10–30%。工程上的真实门槛是内核版本下限 ≥ 5.15、容器 seccomp 默认屏蔽、安全 CVE 历史重、多云厂商禁用,以及一条必须铭刻的规则:CQE 的完成顺序和 SQE 的提交顺序无关,必须靠 userdata 关联。
-
C++ 网络编程:epoll、Reactor 与 one loop per thread
C++ 标准库到 C++20 都没有网络库(Networking TS 因 executor 重构被无限期搁置)。Linux 生产方案是 epoll ET + Reactor 模式 + one loop per thread:主 Reactor accept 连接分发到工作线程池,每个工作线程独占 EventLoop 处理自己的连接,通过 eventfd 跨线程唤醒、timerfd 统一定时器、sharedptr + weakptr 管理 TcpConnection 生命周期。muduo 是国内 C++ 服务器开发事实上的学习范本。
-
Linux I/O(三):BSD socket 编程手册
socket API 的本质是把"可寻址的双向通信"塞进 fd 抽象(everything is a file),代价是必须通过 setsockopt/shutdown/getsockopt 等元操作补齐 TCP 状态机的语义;生产代码的复杂度集中在短读/短写循环、EAGAIN/EINTR 重试、SIGPIPE 屏蔽、字节序转换、TIMEWAIT 与 SOREUSEADDR 的误解这五个点上。