TCPsocket编程从accept到线程池连接型服务器的第一课
TCP socket 编程从 accept 到线程池连接型服务器的第一课我的github(https://github.com/xcx55/ubuntu-linux-project)感谢各位大佬参观我的githubUDP 那条线走完后8 月 30 号到 9 月 1 号进入了 TCP 编程。和 UDP 相比TCP 的接口多了一层连接的概念而这一层连接带来了一整套新的问题服务端怎么同时服务多个客户端串行、多进程、多线程、线程池该怎么选这篇按笔记的推进顺序整理。一、TCP 和 UDP 编程模型的本质差异先抓住一句话核心UDP 是一个 socket 文件打天下TCP 是一个监听文件 一堆连接文件。UDP数据直接写进 socket 文件里报文自带sockaddr_in——每个报文都自带地址recvfrom一次拿数据一次拿对端地址谁发的就回给谁TCP先listen connect建立连接然后accept返回一个新的 fd后续的读写都发生在这个新 fd 上。具体到 accept 的动作accept等待客户端的connect拿到客户端的sockaddr_in把这个sockaddr_in交给当前打开的 sockfd 文件记录再打开一个新 file作为后续 read/write 的对象。一个有意思的对照TCP 和 UDP 拿取 sockaddr_in 的方式一模一样——区别只在于 UDP 是每个报文都带TCP 是连接建立时带一次、终身有效。另一个对照listensockfd一个文件服务多个 ip 和端口——它是接客的门童自己不运货运货的是 accept 返回的那一个个连接 fd。还有一条容易被忽略的底层事实read 函数会分别判断 fd 的类型——管道、普通文件、网络文件TCP 的文件各走各的分支。这就是一切皆文件的代价与回报接口统一内部分流。二、服务多个客户端四种姿势的演进客户端一多问题立刻来了如果在一个循环里串行地ServerIO(fd, pq)一个客户端没处理完下一个 accept 就被堵着——串行执行是阻塞的。笔记里把解决方案按历史顺序排了一遍1. 串行最朴素while(true) { accept → ServerIO(fd, pq) → close(fd); }。能用但一次只能伺候一个人。2. 多进程每个客户端 fork 一个子进程去处理。要配一句signal(SIGCHLD, SIG_IGN)让内核自动回收子进程否则僵尸进程堆积。但笔记里直言这样很容易被搞挂掉——fork 的成本摆在那。3. 多线程比 fork 便宜但长服务下会线程溢出。这里笔记里给出了一组关键概念短服务处理逻辑短线程滞留时间短线程不会太溢出“比较清爽”——平时的登录注册都是短服务长服务一个微信要是 1000000 个客户端连过来一个连接一个线程服务器不得炸了4. 线程池把线程数量钉死任务进队列voidStart(){signal(SIGCHLD,SIG_IGN);threadpoolcallback_t*pathreadpoolcallback_t::Getthreadpool();while(true){sockaddr_in pq;socklen_t asizeof(sockaddr_in);intfdaccept(_listensockfd,(sockaddr*)pq,a);// listen内部if(fd0){std::coutaccept errstd::endl;continue;}pa-Enqueue([fd,pq,this]()-void{this-ServerIO(fd,pq);});}}一句话点评接入线程池限制了效率上限但服务器不会挂掉——用峰值性能换稳定性这笔账在服务端永远是划算的。线程池版本还带来一个设计红利回调可以在 ServerIO 里再次包装——比如处理指令就是远程处理类业务逻辑通过 lambda 注册进来服务器骨架完全不用改。这正好接上了线程池那篇回调 底层调用上层的结论。三、connect 的隐式绑定UDP 那篇讲过 sendto 会隐式 bindTCP 这边对称地来了一个connect 和 sendto 一样会把 sockfd 进行隐式绑定——客户端不用显式 bindconnect 时若还没绑定相当于pa nullptr就进行默认绑定并默认发送。规则是通用的主动发起通信的一方端口交给 OS 随机分配。四、地址转换函数的两个坑inet_ntoa 为什么不可重入inet_ntoa把 4 字节整数 IP 转成点分十进制字符串用起来很顺手但它有个隐蔽的问题返回的 char是函数内部 static 的所以它是不可重入函数。*推演一下事故现场线程 A 调用inet_ntoa还没来得及使用返回值线程 B 也调用了inet_ntoa——static 缓冲区被覆盖线程 A 拿到的是别人的 IP 字符串。而inet_ntoa没有加锁这个坑是无声的。正解是用这一对inet_ntop()网络序整数 → 字符串n networkp presentation进程序列多传一个缓冲区参数inet_pton()字符串 → 网络序整数。缓冲区 库内的锁同时解决了线程安全和存储安全——调用者自己的缓冲区谁也覆盖不了。这个用调用者提供的缓冲区代替函数内 static 缓冲区的手法是可重入函数设计的标准范式和信号处理那篇不可重入函数的讨论完全呼应。五、小结UDPTCPsocket 文件一个读写都在它listensockfd 每连接一个 fd对端地址每个报文自带accept 时拿到一次客户端 bindsendto 隐式绑定connect 隐式绑定多客户端无连接天然并发串行 → 多进程 → 多线程 → 线程池推荐的地址转换inet_ntop / inet_pton不要用 inet_ntoa不可重入TCP 编程的第一课其实不是接口而是**连接这个概念给服务端带来的并发压力**——UDP 天生无连接无所谓并发模型TCP 每一个连接都是一份要长期持有的资源于是才有短服务/长服务的取舍和线程池的登场。而连接维持住了之后新的问题马上出现TCP 发的数据是一片一片的读到的东西可能半截——这就引出了下一篇的主角序列化与自定义协议。

相关新闻

把Profiler塞进玩家真机:轻量级性能监控SDK设计与实践

把Profiler塞进玩家真机:轻量级性能监控SDK设计与实践

以前做移动游戏性能优化,最头疼的就是手里的 Profiler 只能在开发机上跑。办公室里数据漂漂亮亮,玩家反馈却永远是“卡顿”“发热”“玩一会儿就掉帧”,你连个像样的采样都拿不到。后来我们干脆换了个思路:既然拉不齐设备环境&…

2026/10/1 9:56:38 阅读更多 →
DeepSeek 实战指南:API 调用、本地部署与第三方工具接入

DeepSeek 实战指南:API 调用、本地部署与第三方工具接入

简介:这份PDF文档面向对DeepSeek感兴趣、希望快速上手并高效运用的各类用户,无论初学者还是有一定经验的人士均可从中获益。内容围绕DeepSeek-V3发布后的实用技巧展开,涵盖官方入口获取、关键设置激活、提示词策略调整、通俗化追问、多风格改…

2026/10/1 9:57:25 阅读更多 →
对抗生成网络架构拆解:生成器判别器、损失函数与训练排查

对抗生成网络架构拆解:生成器判别器、损失函数与训练排查

对抗生成网络这几年从学术圈的玩具变成了不少业务里的常规工具,做数据增强、做图像修复、做风格迁移、做合成样本补足长尾类别,都能见到它的身影。但真正上手写过的人都知道,对抗生成网络最劝退的地方不是代码量,而是它的架构设计…

2026/10/1 9:57:00 阅读更多 →

最新新闻

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器全攻略:鼠标自动连点、键盘输入与免费工具筛选

连点器这三个字一出来,很多人第一反应是"游戏挂机脚本",但说实话我用了这么多年,鼠标自动连点真正帮我省下大把时间的场景,反而是那些枯燥到让人怀疑人生的重复工作:一遍遍点"下一步"、批量填表、…

2026/10/1 12:50:58 阅读更多 →
Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

Jev模型结构化输出实战:JSON Schema约束如何让判断题成本直降5倍

1. 从一张账单说起:为什么同一个判断题,成本能差 5 倍 先把场景摆出来。我最近在做一个批量内容审核的小工具,核心逻辑特别简单:给一段文本,让模型判断它是否属于某个类别,输出只有两个值——是或否。这种任…

2026/10/1 12:50:58 阅读更多 →
ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

ECC公钥压缩与非压缩格式:汽车电子选型与避坑指南

1. 汽车电子里的ECC公钥,为什么格式值得拿出来单聊做车载安全的人应该都有感触:ECC(椭圆曲线密码)在车联网和汽车电子里的应用已经非常密集,V2X车路协同、OTA升级签名、安全启动、SecOC报文认证、PKI证书链&#xff0c…

2026/10/1 12:50:58 阅读更多 →
IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

IEC 62351-100-3一致性测试全解析:从安全机制到工程实践

拿到IEC 62351-100-3一致性测试任务的时候,我第一反应是找标准原文、打开产品功能清单,准备一项一项打勾。真正进了实验室才发现,这套测试折腾的根本不是“功能是否正常”,而是“产品对安全机制的理解是否和标准一致”。业务功能正…

2026/10/1 12:50:58 阅读更多 →
Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

Wine+FEX-Emu+DXMT:在Apple Silicon上运行Windows游戏的完整指南

1. 从“Madeira”这个名字说起:它到底指什么第一次看到“Madeira”这个词,很多人第一反应是葡萄牙那个盛产葡萄酒的海岛,或者是一道叫“马德拉酱汁”的西餐配料。但在技术圈里,尤其是围绕 Wine、FEX-Emu、DXMT 这些关键词的讨论中…

2026/10/1 12:50:58 阅读更多 →
Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 安装全流程避坑指南:从分区到驱动配置

Ubuntu Desktop 的安装,单看流程图确实简单到让人提不起兴趣:下镜像、写U盘、引导、分区、下一步。但真正动手装过十几台机器之后你会发现,翻车的点几乎全在"下一步"之外——UEFI 和 Legacy 引导混着用导致装完进不去系统、硬盘分区…

2026/10/1 12:49:58 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →