新闻详情

新闻详情

首页 / 资讯中心 / 详情

TCPsocket编程从accept到线程池连接型服务器的第一课

发布时间:2026/9/30 9:46:47来源:尧图网络
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 发的数据是一片一片的读到的东西可能半截——这就引出了下一篇的主角序列化与自定义协议。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

嘉兴食品外箱收缩膜怎么选?上海睿越塑料,长三角就近供应 适配食品整箱打包 2026/9/30 10:36:01

嘉兴食品外箱收缩膜怎么选?上海睿越塑料,长三角就近供应 适配食品整箱打包

嘉兴是长三角食品产业核心集聚区,休闲食品、粮油烘焙、农产品加工等食品加工厂密集,纸箱、泡沫箱外箱用 PE 收缩膜是产品流通的刚需包装材料。很多嘉兴食品厂采购外箱收缩膜时,常遇到膜材易破、收缩不均、食品级资质不全、异地供应商补单慢等…

阅读更多 →
被投诉的柴犬、扑人的金毛、焦虑的布偶猫,端到端具身交互智能宠物训练师的两个月矫正手记 2026/9/30 10:36:01

被投诉的柴犬、扑人的金毛、焦虑的布偶猫,端到端具身交互智能宠物训练师的两个月矫正手记

被投诉的柴犬、扑人的金毛、焦虑的布偶猫,端到端具身交互智能宠物训练师的两个月矫正手记 训练手记的扉页上,记着三个名字和三个问题:柴犬小柴,快递一来就叫,两周被邻居投诉三次;金毛大毛,见人就…

阅读更多 →
我在HarmonyOS 7上用三行代码做了个扫描工具,才明白端侧AI为什么是小开发者的春天 2026/9/30 10:35:54

我在HarmonyOS 7上用三行代码做了个扫描工具,才明白端侧AI为什么是小开发者的春天

说实话,一开始看到API 26更新Core Vision Kit的时候,我没太当回事。 OCR嘛,哪个平台没有?百度阿里腾讯都有免费接口,接一下也不难。图像超分更是老话题了,各种APP都带,吹了好几年。文搜图听起来…

阅读更多 →
Linux服务器安全加固全攻略 从SSH、用户权限到防火墙、审计监控,四维纵深防御一次讲透! 2026/9/30 10:35:48

Linux服务器安全加固全攻略 从SSH、用户权限到防火墙、审计监控,四维纵深防御一次讲透!

你刚开了一台云服务器,默认只开了 SSH 22 端口、允许 root 密码登录、防火墙没启用——对攻击者来说,这几乎是一张"邀请函"。 互联网上每分钟都有大量僵尸网络在扫描 22 端口、尝试弱口令、撞库,一旦成功就植入挖矿木马、勒索病毒&…

阅读更多 →
嵌入式开发是否吃青春饭?四条赛道经验价值深度解析 2026/9/30 10:35:41

嵌入式开发是否吃青春饭?四条赛道经验价值深度解析

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

阅读更多 →
Vue中img图片加载状态处理:组件封装、指令与懒加载 2026/9/30 10:35:41

Vue中img图片加载状态处理:组件封装、指令与懒加载

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉