<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>物联网心球</title><link>https://yshbyte.com/</link><description>Recent content on 物联网心球</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 31 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://yshbyte.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Linux环境编程从入门到精通</title><link>https://yshbyte.com/courses/linux-env-programming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yshbyte.com/courses/linux-env-programming/</guid><description>文件 IO、进程、线程、信号、进程间通信：61 讲吃透 Linux 环境编程，图文并茂，真机演示。</description></item><item><title>容器技术训练营 · 45 天</title><link>https://yshbyte.com/camp/container-runtime/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yshbyte.com/camp/container-runtime/</guid><description>&lt;p&gt;跟着课程进度亲手写一个迷你容器运行时。本页是「容器技术训练营」的完整介绍：18 讲视频课、45 天学习节奏、mycontainer 真机项目与社群服务。&lt;/p&gt;</description></item><item><title>第 1 章 计算机网络基础</title><link>https://yshbyte.com/book/chapter-1/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yshbyte.com/book/chapter-1/</guid><description>&lt;!-- 【试读节选粘贴区】把书中允许公开试读的正文（文字 + 图片）粘贴到本注释下方，会显示在导读卡之后、小节导航之前 --&gt;&#10;&lt;p&gt;本章从 OSI 参考模型讲到跨网段通信，把「两台主机之间数据是怎么走完全程的」这条主线走通，为后面所有章节打底。&lt;/p&gt;</description></item><item><title>Linux网络编程从入门到精通</title><link>https://yshbyte.com/courses/linux-net-programming/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yshbyte.com/courses/linux-net-programming/</guid><description>从 TCP/IP 分层模型到组播广播：80 讲吃透 Linux 网络编程，每个知识点图文讲解 + 课后练习。</description></item><item><title>第 2 章 认识套接字</title><link>https://yshbyte.com/book/chapter-2/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://yshbyte.com/book/chapter-2/</guid><description>&lt;!-- 【试读节选粘贴区】把书中允许公开试读的正文（文字 + 图片）粘贴到本注释下方，会显示在导读卡之后、小节导航之前 --&gt;&#10;&lt;p&gt;本章回答「套接字到底是什么」：先从不同使用视角认识它，再钻进内核看清 Linux 收发数据的完整路径，最后过一遍常见套接字类型。&lt;/p&gt;</description></item><item><title>一文搞懂 Linux cgroup</title><link>https://yshbyte.com/articles/yi-wen-gao-dong-linux-cgroup/</link><pubDate>Fri, 31 Jul 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-wen-gao-dong-linux-cgroup/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;本期文章，我们来深入学习 Linux cgroup。&lt;/p&gt;&#10;&lt;h2 id="1cgroup-是什么"&gt;1.cgroup 是什么？&lt;/h2&gt;&#10;&lt;p&gt;cgroup（Control Groups）是 Linux 内核提供的一种机制，用于限制、记录和隔离进程组使用的物理资源（CPU、内存、磁盘 I/O 等）。它是容器技术（Docker、Kubernetes）实现资源隔离的底层基石。&lt;/p&gt;</description></item><item><title>6张图搞懂 Linux 进程调度系统</title><link>https://yshbyte.com/articles/6-zhang-tu-gao-dong-linux-jin-cheng-diao-du-xi-t/</link><pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/6-zhang-tu-gao-dong-linux-jin-cheng-diao-du-xi-t/</guid><description>&lt;p&gt;大家好，这里是物联网心球。本期文章我们来深入学习 Linux 进程调度系统。&lt;/p&gt;&#10;&lt;h2 id="1进程调度是什么"&gt;1.进程调度是什么？&lt;/h2&gt;&#10;&lt;p&gt;进程调度是内核按照既定规则，从就绪队列里挑选进程、分配 CPU 使用权，并完成进程切换的整套机制。&lt;/p&gt;</description></item><item><title>4张图搞懂Linux环境变量</title><link>https://yshbyte.com/articles/4-zhang-tu-gao-dong-linux-huan-jing-bian-liang/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/4-zhang-tu-gao-dong-linux-huan-jing-bian-liang/</guid><description>&lt;p&gt;大家好，我是图书《图解Linux网络编程》的作者，本文我们来深入探讨 Linux 环境变量。&lt;/p&gt;&#10;&lt;h2 id="1什么是环境变量"&gt;1.什么是环境变量？&lt;/h2&gt;&#10;&lt;p&gt;环境变量是每个进程独享、可继承的一组 key=value 字符串，用于给进程传递运行配置、路径、语言、用户信息等全局参数。&lt;/p&gt;</description></item><item><title>2张图彻底搞懂 Linux 直接 I/O</title><link>https://yshbyte.com/articles/2-zhang-tu-che-di-gao-dong-linux-zhi-jie-i-o/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/2-zhang-tu-che-di-gao-dong-linux-zhi-jie-i-o/</guid><description>&lt;p&gt;大家好，我是图书《图解Linux网络编程》的作者，本期文章我们来深入探索 Linux 直接 I/O。&lt;/p&gt;&#10;&lt;h2 id="1什么是直接-io"&gt;1.什么是直接 I/O&lt;/h2&gt;&#10;&lt;p&gt;直接 I/O（Direct I/O）是一种绕过文件页缓存的文件访问方式。应用程序直接从磁盘读写数据，避免了文件页缓存与用户缓冲区之间的额外数据拷贝，常用于数据库等对数据一致性和缓存控制要求较高的场景。&lt;/p&gt;</description></item><item><title>我的视频专栏【硬核Linux】上线了</title><link>https://yshbyte.com/articles/wo-de-shi-pin-zhuan-lan-ying-he-linux-shang-xian/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/wo-de-shi-pin-zhuan-lan-ying-he-linux-shang-xian/</guid><description>&lt;p&gt;大家好，我是图书《图解Linux网络编程》作者，我的视频专栏【硬核Linux】上线了。一直以来，我都在持续输出高质量图解Linux文章，目前已经更新了近百篇文章（基本能够保证一周一更），由于每篇文章都花了比较多时间精力打磨，所以我的文章很受读者的喜欢。除了文章，我一直想尝试视频这种表达方式，视频可以让大家更加了解我，能够将我的内容更加直观地展示给大家。关于视频形式和内容规划，我思考了很久，最初的方案是以整套课程的形式录制，但这种方式很笨重不够灵活，Linux的内容难度大而且知识点非常多，所以需要将这个任务进行分解，视频专栏是最贴合的一种方式。1.一分钟了解【硬核Linux】&lt;/p&gt;</description></item><item><title>四张图搞懂 Linux 进程是什么？</title><link>https://yshbyte.com/articles/si-zhang-tu-gao-dong-linux-jin-cheng-shi-shen-me/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/si-zhang-tu-gao-dong-linux-jin-cheng-shi-shen-me/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;本期文章，我们通过四张图来了解Linux进程是什么？&lt;/p&gt;&#10;&lt;h2 id="1什么是进程"&gt;1.什么是进程？&lt;/h2&gt;&#10;&lt;p&gt;Linux 进程是正在运行的程序的实例，它是操作系统进行资源分配（如CPU、内存）和独立调度的基本单位。每个进程都拥有自己独立的虚拟地址空间和运行环境，彼此相互隔离。&lt;/p&gt;</description></item><item><title>从入门到精通：Linux sysfs 全解析，这一篇就够了</title><link>https://yshbyte.com/articles/cong-ru-men-dao-jing-tong-linux-sysfs-quan-jie-x/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/cong-ru-men-dao-jing-tong-linux-sysfs-quan-jie-x/</guid><description>&lt;p&gt;大家好，这里是物联网心球。 本期文章我们来学习 sys 文件系统，sys 文件系统和 proc 文件系统都是内核伪文件系统（ proc 文件系统文章链接：一文吃透 Linux proc 文件系统），二者都是用来暴露内核数据，为什么已经有了 proc 文件系统还要引入 sys 文件系统呢？带着这个问题，进入今天的主题。&lt;/p&gt;</description></item><item><title>7张图搞懂Linux文件页缓存（Page Cache）</title><link>https://yshbyte.com/articles/7-zhang-tu-gao-dong-linux-wen-jian-ye-huan-cun-p/</link><pubDate>Mon, 23 Feb 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/7-zhang-tu-gao-dong-linux-wen-jian-ye-huan-cun-p/</guid><description>&lt;p&gt;大家好，这里是物联网心球。本文我们来学习Linux文件页缓存，揭秘Linux读写文件背后的秘密。&lt;/p&gt;&#10;&lt;h2 id="1文件页缓存是什么"&gt;1.文件页缓存是什么？&lt;/h2&gt;&#10;&lt;p&gt;文件页缓存是磁盘文件在内存中的一个副本，由于磁盘文件通常以数据块（4KB）来管理，所以文件页缓存也会以“块”来管理，这里块就是页（struct page），每个 page 都会对应 4KB 物理内存。&lt;/p&gt;</description></item><item><title>5张图带你彻底搞懂Linux VFS虚拟文件系统</title><link>https://yshbyte.com/articles/5-zhang-tu-dai-ni-che-di-gao-dong-linux-vfs-xu-n/</link><pubDate>Mon, 26 Jan 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/5-zhang-tu-dai-ni-che-di-gao-dong-linux-vfs-xu-n/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;VFS（Virtual File System，虚拟文件系统）是Linux系统中一个非常重要的概念，是Linux设计思想的核心。不管你是学习Linux编程还是研究Linux内核源码，都必须对VFS有深入的理解。&lt;/p&gt;</description></item><item><title>图文详解：Linux epoll和io_uring到底谁更牛？</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-epoll-he-io-uring-dao-di/</link><pubDate>Wed, 14 Jan 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-epoll-he-io-uring-dao-di/</guid><description>&lt;p&gt;大家好，这里是物联网心球。一直以来，在Linux高性能网络编程中使用最多的网络I/O模型是epoll。epoll除了性能优越，稳定性也很高，似乎epoll成了高并发应用场景的唯一选择。然而随着io_uring的出现，这一局面慢慢被打破。 io_uring是异步I/O，同样性能优越，那么epoll和io_uring到底谁更牛呢？今天我们来深入探讨一下。&lt;/p&gt;</description></item><item><title>图文详解Linux 1号进程（init进程）</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-1-hao-jin-cheng-init-jin/</link><pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-1-hao-jin-cheng-init-jin/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;作为一个Linux开发者，大名鼎鼎的1号进程（init进程）我们一定都听说过。在Linux系统的进程家族中，1号进程是内核启动后创建的第一个用户进程，是所有用户进程的祖先，本文我们将揭秘1号进程的底层实现原理。&lt;/p&gt;</description></item><item><title>我的新书《图解Linux网络编程》出版了！</title><link>https://yshbyte.com/articles/wo-de-xin-shu-tu-jie-linux-wang-luo-bian-cheng-c/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/wo-de-xin-shu-tu-jie-linux-wang-luo-bian-cheng-c/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;很高兴我的新书《图解Linux网络编程》和大家见面了。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/wo-de-xin-shu-tu-jie-linux-wang-luo-bian-cheng-c/01571fae19bf.jpg" alt="我的新书《图解Linux网络编程》出版了！ 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图1 图书封面&lt;/p&gt;&#10;&lt;p&gt;图书的封面是几只快乐的企鹅在雪地里玩耍，希望大家在Linux学习的道路上也能够收获快乐和喜悦。接下来，我给大家介绍一下我的这本书。（图书购买方式在文章末尾）&lt;/p&gt;</description></item><item><title>图文详解Linux根文件系统</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-gen-wen-jian-xi-tong/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-gen-wen-jian-xi-tong/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&#10;本文的主题是Linux根文件系统，在进入正文之前，我们先来思考一个问题：什么是Linux根文件系统？ 根文件系统被认为是Linux内核启动后挂载的第一个文件系统，是Linux文件树的根，是所有绝对路径的起点。笔者认为，这种表达并不够精准。接下来，我们从内核视角出发，深入了解Linux根文件系统。&#10;注意：本文基于内核6.10版本讲解。&lt;/p&gt;</description></item><item><title>从ext4文件系统到Linux文件树</title><link>https://yshbyte.com/articles/cong-ext4-wen-jian-xi-tong-dao-linux-wen-jian-sh/</link><pubDate>Wed, 10 Dec 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/cong-ext4-wen-jian-xi-tong-dao-linux-wen-jian-sh/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;作为一个Linux开发者，我们经常会跟文件打交道。虽然我们经常在使用文件，但是对文件的理解却不深刻，只停留在表面。笔者一直以来都很好奇，当我们执行文件操作时，内核和硬件设备都在做些什么？本文我们以ext4文件系统为例，来讲解Linux文件的底层实现原理。&lt;/p&gt;</description></item><item><title>图文详解Linux动态库（.so文件）工作原理</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-dong-tai-ku-so-wen-jian-g/</link><pubDate>Thu, 20 Nov 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-linux-dong-tai-ku-so-wen-jian-g/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;说到Linux动态库（.so文件）大家并不陌生，我想每个Linux开发者都应该使用过Linux动态库。动态库的使用其实并不简单，我们平时习以为常的动态库操作背后都隐藏了哪些秘密？本文我们一一来揭晓。&lt;/p&gt;</description></item><item><title>4张图教你高效解决Linux内存泄漏</title><link>https://yshbyte.com/articles/4-zhang-tu-jiao-ni-gao-xiao-jie-jue-linux-nei-cu/</link><pubDate>Thu, 13 Nov 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/4-zhang-tu-jiao-ni-gao-xiao-jie-jue-linux-nei-cu/</guid><description>&lt;p&gt;大家好，这里是物联网心球。一直以来，笔者都想写一篇Linux内存泄漏相关的文章，原因有两点：内存泄漏是软件开发中经常会碰到的问题，并且很多初学并不会排查Linux内存泄漏问题；笔者工作的这些年里，掌握了很多内存泄漏调试的方法，这些方法比较零散，借着这篇文章整理一下零碎的知识，形成一篇Linux内存调试指南，帮助大家解决Linux内存泄漏问题。&lt;/p&gt;</description></item><item><title>从Linux内核角度看TCP粘包</title><link>https://yshbyte.com/articles/cong-linux-nei-he-jiao-du-kan-tcp-zhan-bao/</link><pubDate>Mon, 03 Nov 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/cong-linux-nei-he-jiao-du-kan-tcp-zhan-bao/</guid><description>&lt;p&gt;大家好，这里是物联网心球。今天我们来学习TCP粘包，TCP粘包是工作和面试中经常会碰到的问题。网上有一些资料也介绍过TCP粘包，但是这些资料更多的讲述的是TCP粘包的解决方案，并没有对问题的原因做详细的介绍。本文从内核的角度出发，将TCP粘包原因和解决方案给大家讲清楚。&lt;/p&gt;</description></item><item><title>14张图彻底搞懂malloc、free源码</title><link>https://yshbyte.com/articles/14-zhang-tu-che-di-gao-dong-malloc-free-yuan-ma/</link><pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/14-zhang-tu-che-di-gao-dong-malloc-free-yuan-ma/</guid><description>&lt;p&gt;大家好，这里是物联网心球。笔者一直想写一些和读者们工作比较贴近的文章，最近发现大家对malloc和free的关注度比较高，正好笔者也认真研究过glibc源码，所以决定详细介绍一下malloc和free的底层原理和源码实现。 （本文以64位系统为例，基于glibc 2.39版本）&lt;/p&gt;</description></item><item><title>图文详解gcc -g调试信息</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-gcc-g-tiao-shi-xin-xi/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-gcc-g-tiao-shi-xin-xi/</guid><description>&lt;p&gt;大家好，这里是物联网心球。作为一个Linux开发者，我们经常会通过gcc -g命令来编译可执行程序，-g选项能够生成调试信息，开发者根据调试信息能够快速定位并排查程序问题。那么，调试信息到底是什么呢？本文我们一探究竟。&lt;/p&gt;</description></item><item><title>gdb调试coredump文件从原理到应用</title><link>https://yshbyte.com/articles/gdb-tiao-shi-coredump-wen-jian-cong-yuan-li-dao/</link><pubDate>Sat, 27 Sep 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/gdb-tiao-shi-coredump-wen-jian-cong-yuan-li-dao/</guid><description>&lt;p&gt;大家好，这里是物联网心球。 上一篇文章&lt;a href="https://yshbyte.com/articles/4-zhang-tu-gao-qing-chu-gdb-gong-zuo-yuan-li/"&gt;4张图搞清楚gdb工作原理&lt;/a&gt;成为了一篇热门文章，我想大家对于gdb都比较感兴趣。本文我们来探讨gdb另外一个比较重要的话题：coredump文件。 coredump文件能够帮助我们解决程序异常退出等严重问题，那么它是如何做到的呢？带着这个问题，开始本文的学习。&lt;/p&gt;</description></item><item><title>4张图搞清楚gdb工作原理</title><link>https://yshbyte.com/articles/4-zhang-tu-gao-qing-chu-gdb-gong-zuo-yuan-li/</link><pubDate>Thu, 11 Sep 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/4-zhang-tu-gao-qing-chu-gdb-gong-zuo-yuan-li/</guid><description>&lt;p&gt;大家好，这里是物联网心球。 gdb是Linux开发者经常会用到的调试工具，相信大部分读者都会使用gdb命令来调试程序。那么大家是否好奇：gdb为什么能够调试我们的程序呢？本文我们来一探究竟。&lt;/p&gt;</description></item><item><title>一文搞懂TCP Nagle算法</title><link>https://yshbyte.com/articles/yi-wen-gao-dong-tcp-nagle-suan-fa/</link><pubDate>Wed, 03 Sep 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-wen-gao-dong-tcp-nagle-suan-fa/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们来讨论一个比较热门的话题TCP Nagle算法。关于TCP Nagle算法，大家或多或少接触过。但是，大家未必能够把TCP Nagle算法讲清楚。面试时，考官也喜欢问Nagle算法相关的问题。所以我们很有必要把这个问题搞清楚。&lt;/p&gt;</description></item><item><title>从ulimit命令看Linux进程资源限制</title><link>https://yshbyte.com/articles/cong-ulimit-ming-ling-kan-linux-jin-cheng-zi-yua/</link><pubDate>Tue, 26 Aug 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/cong-ulimit-ming-ling-kan-linux-jin-cheng-zi-yua/</guid><description>&lt;p&gt;大家好，这里是物联网心球。 ulimit是我们经常会使用到的命令，这个命令对Linux性能优化很有帮助。那么，当我们执行ulimit命令时，系统都做了哪些工作？今天我们来一探究竟。&lt;/p&gt;</description></item><item><title>进程栈和线程栈傻傻分不清楚</title><link>https://yshbyte.com/articles/jin-cheng-zhan-he-xian-cheng-zhan-sha-sha-fen-bu/</link><pubDate>Mon, 18 Aug 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/jin-cheng-zhan-he-xian-cheng-zhan-sha-sha-fen-bu/</guid><description>&lt;p&gt;大家好，这里是物联网心球。 上一篇文章&lt;a href="https://yshbyte.com/articles/4-zhang-tu-gao-dong-dui-he-zhan-de-qu-bie/"&gt;4张图搞懂堆和栈的区别&lt;/a&gt;受到很多读者的欢迎，成为了爆款文章。本章我们趁热打铁，来学习一下进程栈和线程栈。 关于进程栈，大家应该都比较了解了，进程虚拟地址空间中的栈其实就是进程栈。那么什么是线程栈呢？本章将给出答案。&lt;/p&gt;</description></item><item><title>4张图搞懂堆和栈的区别</title><link>https://yshbyte.com/articles/4-zhang-tu-gao-dong-dui-he-zhan-de-qu-bie/</link><pubDate>Wed, 06 Aug 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/4-zhang-tu-gao-dong-dui-he-zhan-de-qu-bie/</guid><description>&lt;p&gt;大家好，这里是物联网心球。今天我们来聊聊堆栈，堆栈是软件开发人员绕不过的一个概念。堆栈指的是堆和栈两种内存区域。很多读者喜欢从数据结构的角度来学习堆栈，这种方式并不会让大家真正理解堆栈。&lt;/p&gt;</description></item><item><title>一步步带你彻底搞懂异步I/O</title><link>https://yshbyte.com/articles/yi-bu-bu-dai-ni-che-di-gao-dong-yi-bu-i-o/</link><pubDate>Wed, 30 Jul 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-bu-bu-dai-ni-che-di-gao-dong-yi-bu-i-o/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;在计算机系统中，CPU和内存属于高速设备，而磁盘、网卡等设备属于低速设备。高速设备和低速设备之间传输数据时，高速设备通常需要等待低速设备。I/O模型定义了应用程序与操作系统内核在数据交互过程中的协作方式，主要为了解决高速设备和低速设备之间传输速率不匹配的问题。&lt;/p&gt;</description></item><item><title>一张图搞懂mmap实现原理（通俗易懂）</title><link>https://yshbyte.com/articles/yi-zhang-tu-gao-dong-mmap-shi-xian-yuan-li-tong/</link><pubDate>Sat, 26 Jul 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-zhang-tu-gao-dong-mmap-shi-xian-yuan-li-tong/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们来聊聊mmap，&lt;code&gt; mmap&lt;/code&gt;是 Linux系统的一种内存映射机制，允许将文件或设备直接映射到进程的虚拟地址空间 。进程通过操作内存指针即可读写文件，无需调用 &lt;code&gt;read&lt;/code&gt;/&lt;code&gt;write&lt;/code&gt; 等系统调用。mmap内存映射在Linux系统中广泛被使用，如：内存分配、零拷贝网络传输、进程间通信、大文件处理等。&lt;/p&gt;</description></item><item><title>图解Linux 7种文件类型</title><link>https://yshbyte.com/articles/tu-jie-linux-7-zhong-wen-jian-lei-xing/</link><pubDate>Fri, 18 Jul 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-7-zhong-wen-jian-lei-xing/</guid><description>&lt;p&gt;大家好，这里是物联网心球。今天，我们来聊聊Linux 7种文件类型。对Linux系统有一定了解的同学一定知道Linux有7种文件类型，分别为：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;普通文件（ - ）：存储数据、文本或可执行程序的基本文件类型。&lt;/p&gt;</description></item><item><title>网络编程之端口复用</title><link>https://yshbyte.com/articles/wang-luo-bian-cheng-zhi-duan-kou-fu-yong/</link><pubDate>Sat, 29 Mar 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/wang-luo-bian-cheng-zhi-duan-kou-fu-yong/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;最近一直忙着写新书，本文同样是新书的一个小节。本文讨论的是网络编程中一个比较重要概念端口复用。&lt;/p&gt;&#10;&lt;p&gt;端口复用，即两个套接字绑定相同的IP和端口。注意这里说的两个套接字指的是两个TCP套接字或两个UDP套接字，而不是一个TCP和一个UDP套接字。TCP和UDP套接字使用的是两套独立的端口体系，二者之间使用相同的IP和端口没有任何冲突。&lt;/p&gt;</description></item><item><title>Linux epoll完全图解，彻底搞懂epoll机制</title><link>https://yshbyte.com/articles/linux-epoll-wan-quan-tu-jie-che-di-gao-dong-epol/</link><pubDate>Sat, 11 Jan 2025 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-epoll-wan-quan-tu-jie-che-di-gao-dong-epol/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;最近一直忙着写我的新书，很久没有更新文章了，今天的文章是新书中的一个小节，希望能帮助大家彻底搞懂epoll机制。&lt;/p&gt;&#10;&lt;h2 id="1从内核看epoll机制"&gt;1.从内核看epoll机制&lt;/h2&gt;&#10;&lt;p&gt;select和poll虽然能够实现IO复用的功能，但是由于设计的缺陷，select和poll无法处理海量的网络连接，并且随着网络连接数量的增加，select和poll效率越来越低。&lt;/p&gt;</description></item><item><title>从ELF文件到Linux进程</title><link>https://yshbyte.com/articles/cong-elf-wen-jian-dao-linux-jin-cheng/</link><pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/cong-elf-wen-jian-dao-linux-jin-cheng/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们来聊聊ELF文件，了解一下Linux如何创建进程以及ELF文件如何转变成Linux进程？&lt;/p&gt;&#10;&lt;h2 id="1什么是elf文件"&gt;1.什么是ELF文件？&lt;/h2&gt;&#10;&lt;p&gt;ELF（Executable and Linkable Format）文件是一种目标文件格式，用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。它主要用于Linux平台，用于存储和传输可执行文件和库。&lt;/p&gt;</description></item><item><title>图文详解红黑树(上篇)</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-hong-hei-shu-shang-pian/</link><pubDate>Mon, 21 Oct 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-hong-hei-shu-shang-pian/</guid><description>&lt;p&gt;大家好，这里是物联网心球。今天我们要讲解的是红黑树，相对于数组，哈希表，链表等数据结构，红黑树非常复杂，很多同学都被红黑树的插入和删除操作弄得心态崩溃。本文通过图文详解，让大家彻底搞懂红黑树。为了方便阐述，将图文详解红黑树文章分为上篇和下篇。&lt;/p&gt;</description></item><item><title>Linux高性能编程_哈希表</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-ha-xi-biao/</link><pubDate>Tue, 15 Oct 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-ha-xi-biao/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;谈到Linux高性能编程，我们绕不开高效数据结构，今天我们来讲解哈希表，哈希表是使用非常广泛的数据结构，很多开源项目都会用到哈希表，Linux内核也大量使用了哈希表。&lt;/p&gt;</description></item><item><title>Linux高性能编程_线程池</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-xian-cheng-chi/</link><pubDate>Thu, 03 Oct 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-xian-cheng-chi/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们来学习Linux线程池，线程池是高并发场景必须具备的软件组件，很多开源项目都会使用线程池，话不多说，直接开始。&lt;/p&gt;</description></item><item><title>Linux高性能编程_nginx内存池</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-nginx-nei-cun-chi/</link><pubDate>Mon, 23 Sep 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-nginx-nei-cun-chi/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;上一篇文章&lt;a href="https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-malloc-yuan-li/"&gt;Linux高性能编程_malloc原理&lt;/a&gt;，我们详细介绍了ptmalloc工作原理，了解到采用malloc，free分配内存存在频繁加锁和内存碎片等问题。&lt;/p&gt;&#10;&lt;p&gt;本文我们来分析nginx内存池，看一下nginx内存池能否解决以上问题。&lt;/p&gt;&#10;&lt;h2 id="1nginx内存池实现原理"&gt;1.nginx内存池实现原理&lt;/h2&gt;&#10;&lt;h3 id="11-整体架构"&gt;1.1 整体架构&lt;/h3&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/linux-gao-xing-neng-bian-cheng-nginx-nei-cun-chi/d8d1d60b4310.png" alt="Linux高性能编程_nginx内存池 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;nginx内存池可以分为：小内存池和大内存池。&lt;/p&gt;</description></item><item><title>Linux高性能编程_malloc原理</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-malloc-yuan-li/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-malloc-yuan-li/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;谈到高性能编程，我们绕不过一个问题高效内存分配，通常我们会使用malloc和free函数来申请和释放内存。&lt;/p&gt;&#10;&lt;p&gt;那么我们习以为常的malloc和free函数，真的能满足高性能编程的要求吗？&lt;/p&gt;</description></item><item><title>Linux高性能编程_Reactor模型</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-reactor-mo-xing/</link><pubDate>Mon, 19 Aug 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-reactor-mo-xing/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们要讨论的高性能编程主题是Reactor模型，通过Reactor我们要实现百万并发请求。&lt;/p&gt;&#10;&lt;h2 id="1聊聊百万并发"&gt;1.聊聊百万并发&lt;/h2&gt;&#10;&lt;h3 id="11-什么是百万并发"&gt;1.1 什么是百万并发？&lt;/h3&gt;&#10;&lt;p&gt;百万并发是指一个系统能够同时处理一百万以上的并发连接或请求。&lt;/p&gt;</description></item><item><title>Linux高性能编程_时间轮</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-shi-jian-lun/</link><pubDate>Mon, 05 Aug 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-shi-jian-lun/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;本期我们来聊聊时间轮，话不多说我们直接开始今天的主题。&lt;/p&gt;&#10;&lt;h2 id="1初识时间轮"&gt;1.初识时间轮&lt;/h2&gt;&#10;&lt;p&gt;时间轮（TimingWheel） 是一个环形队列，底层采用数组实现，数组中每个元素都是一个链表，链表中存储的是一个个定时任务。&lt;/p&gt;</description></item><item><title>Linux高性能编程_协程</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-xie-cheng/</link><pubDate>Thu, 18 Jul 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-xie-cheng/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;本文我们讨论的是协程，协程一直是一个很难理解的概念，今天我们来讨论一下协程，希望通过本文大家能够对协程有更深入的理解。&lt;/p&gt;</description></item><item><title>Linux高性能编程_无锁队列</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-wu-suo-dui-lie/</link><pubDate>Wed, 03 Jul 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-wu-suo-dui-lie/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们讨论的主题是无锁队列，有过代码性能优化经验的小伙伴们，应该都听过无锁队列，无锁队列在很多高性能开源项目都有运用，比如：XDP，DPDK等。&lt;/p&gt;</description></item><item><title>Linux高性能编程_原子操作</title><link>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-yuan-zi-cao-zuo/</link><pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-gao-xing-neng-bian-cheng-yuan-zi-cao-zuo/</guid><description>&lt;p&gt;大家好，这里是物联网心球。今天来聊一聊Linux高性能编程，要实现Linux高性能编程，首先我们要完成的工作是无锁化编程，无锁化编程的核心就是我们今天的主题原子操作。&lt;/p&gt;</description></item><item><title>图解Linux内存管理_slab，slub，slob分配器</title><link>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-slab-slub-slob-fen/</link><pubDate>Sun, 02 Jun 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-slab-slub-slob-fen/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;今天我们来聊一下物理内存管理最后一个重要章节，slab内存分配器。&lt;/p&gt;&#10;&lt;p&gt;slab分配器是一种内核内存分配器，它提供了一种高效的方式来分配小对象（通常是小于一个页面大小的对象）的内存。&lt;/p&gt;</description></item><item><title>图解Linux内存管理_伙伴系统</title><link>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-huo-ban-xi-tong/</link><pubDate>Sun, 05 May 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-huo-ban-xi-tong/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&#10;本文我们继续来介绍Linux内存管理，今天要讲的是内存管理中非常重要的机制伙伴系统。&#10;为了小伙伴们能正确理解今天讲的内容，这里需要强调一下，我们今天还是围绕物理内存来讲解，请不要和虚拟内存弄混淆了。&lt;/p&gt;</description></item><item><title>图解Linux内存管理_整体架构</title><link>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-zheng-ti-jia-gou/</link><pubDate>Tue, 02 Apr 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-nei-cun-guan-li-zheng-ti-jia-gou/</guid><description>&lt;p&gt;大家好，这里是物联网心球。&lt;/p&gt;&#10;&lt;p&gt;前面我们学习了很多Linux内存方面的知识，比如：虚拟地址空间，进程空间，内存映射，页表机制等，我们学了这么多知识，似乎对Linux内存似懂非懂，为什么会出现这样的问题？原因在于我们缺乏对物理内存的了解，由于缺乏物理内存管理相关的知识，我们对于内存管理没有形成体系，所以才会似懂非懂。&lt;/p&gt;</description></item><item><title>6张图讲清楚Linux零拷贝技术</title><link>https://yshbyte.com/articles/6-zhang-tu-jiang-qing-chu-linux-ling-kao-bei-ji/</link><pubDate>Thu, 22 Feb 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/6-zhang-tu-jiang-qing-chu-linux-ling-kao-bei-ji/</guid><description>&lt;p&gt;大家好，今天我们来聊一聊Linux零拷贝技术，今天我们以一个比较有代表性的技术sendfile系统调用为切入点，详细介绍一下零拷贝技术的原理。&lt;/p&gt;</description></item><item><title>图解Linux虚拟文件系统(VFS)之关系篇</title><link>https://yshbyte.com/articles/tu-jie-linux-xu-ni-wen-jian-xi-tong-vfs-zhi-guan/</link><pubDate>Fri, 02 Feb 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-xu-ni-wen-jian-xi-tong-vfs-zhi-guan/</guid><description>&lt;p&gt;大家好，今天和大家探讨一下Linux虚拟文件系统，虚拟文件系统是我一直想要去聊的一个知识点，如果你想从事Linux开发相关的工作，一定要了解虚拟文件系统。&lt;/p&gt;</description></item><item><title>8张图讲清楚mmap实现原理</title><link>https://yshbyte.com/articles/8-zhang-tu-jiang-qing-chu-mmap-shi-xian-yuan-li/</link><pubDate>Thu, 04 Jan 2024 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/8-zhang-tu-jiang-qing-chu-mmap-shi-xian-yuan-li/</guid><description>&lt;p&gt;大家好，最近在研究Linux内核以及Linux系统编程的时候，经常会碰到mmap内存映射，mmap函数是实现高性能编程的一个关键点，下面我通过几张图详细介绍一下mmap实现原理。（本文以64位CPU为原型讲解）&lt;/p&gt;</description></item><item><title>图文详解io_uring高性能异步IO架构（原理篇）</title><link>https://yshbyte.com/articles/tu-wen-xiang-jie-io-uring-gao-xing-neng-yi-bu-io/</link><pubDate>Sat, 23 Dec 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-wen-xiang-jie-io-uring-gao-xing-neng-yi-bu-io/</guid><description>&lt;p&gt;说到高性能网络编程，我们第一时间想到的是epoll机制，epoll很长一段时间统治着整个网络编程江湖，然而io_uring的出现，似乎在撼动epoll的统治地位，今天我们来揭开io_uring的神秘面纱。&lt;/p&gt;</description></item><item><title>一文搞懂Linux线程同步原理</title><link>https://yshbyte.com/articles/yi-wen-gao-dong-linux-xian-cheng-tong-bu-yuan-li/</link><pubDate>Fri, 15 Dec 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-wen-gao-dong-linux-xian-cheng-tong-bu-yuan-li/</guid><description>&lt;p&gt;大家好，今天和大家聊一聊Linux线程同步相关的知识，线程同步相关的知识值得花时间好好研究，要设计出高性能软件架构，必须学好Linux线程同步，对Linux线程同步原理有深刻的认知。&lt;/p&gt;</description></item><item><title>由浅入深探讨Linux进程间通信（下篇）</title><link>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to/</link><pubDate>Sun, 10 Dec 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to/</guid><description>&lt;p&gt;前言：&#10;本文是由浅入深探索Linux进程间通信系列最后一篇文章，主要讲解POSIX IPC实现原理。由浅入深系列文章地址：&#10;&lt;a href="https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-3/"&gt;由浅入深探讨Linux进程间通信（上篇）&lt;/a&gt;&#10;&lt;a href="https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-2/"&gt;由浅入深探讨Linux进程间通信（中篇）&lt;/a&gt;&#10;POSIX IPC是基于文件实现的，POSIX IPC符合Linux一切皆文件的思想，使用起来也很方便。&lt;/p&gt;</description></item><item><title>由浅入深探讨Linux进程间通信（中篇）</title><link>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-2/</link><pubDate>Wed, 06 Dec 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-2/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;&#10;&lt;p&gt;上一篇文章&lt;a href="https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-3/"&gt;由浅入深探讨Linux进程间通信（上篇）&lt;/a&gt;只讲解到了进程间通信方法之管道，这一篇文章继续讲解System V进程间通信，话不多说直接开始。&lt;/p&gt;&#10;&lt;h2 id="1system-v进程间通信实现原理"&gt;1.System V进程间通信实现原理&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-2/fa485664deb9.png" alt="由浅入深探讨Linux进程间通信（中篇） 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;System V进程间通信需要借助Linux命名空间来实现。&lt;/p&gt;&#10;&lt;h3 id="11-什么是linux命名空间"&gt;1.1 什么是Linux命名空间？&lt;/h3&gt;&#10;&lt;p&gt;Linux命名空间是一种虚拟化技术，它提供了一种轻量级的虚拟化方式，可以将一个系统中的全局资源隔离开来，使得不同的进程可以拥有自己独立的资源视图。命名空间其实就是一些列资源的集合，每个进程都需要指向这个集合，不同的进程如果指向相同的命名空间，那么进程间就能共享命名空间资源。命名空间内核定义如下：&lt;/p&gt;</description></item><item><title>由浅入深探讨Linux进程间通信（上篇）</title><link>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-3/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-3/</guid><description>&lt;p&gt;前言：&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/you-qian-ru-shen-tan-tao-linux-jin-cheng-jian-to-3/9038cbc0d663.jpg" alt="由浅入深探讨Linux进程间通信（上篇） 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;最近Linux进程间通信视频课程很火爆，很多同学通过这个课程开始对Linux进程间通信原理有所了解，本文继续围绕Linux进程间通信这个主题，由浅入深讲解Linux进程间通信，让你彻底学懂Linux进程间通信。&lt;/p&gt;</description></item><item><title>这么多种TCP服务器，总有一款适合你</title><link>https://yshbyte.com/articles/zhe-me-duo-zhong-tcp-fu-wu-qi-zong-you-yi-kuan-s/</link><pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/zhe-me-duo-zhong-tcp-fu-wu-qi-zong-you-yi-kuan-s/</guid><description>&lt;p&gt;前言：本文以TCP服务器为例，详细讲述TCP各种服务器模型的优缺点，以及TCP服务器模型的演变过程，揭开各种服务器模型的神秘面纱。学完本文，你总能挑选一款合适的TCP服务器。&lt;/p&gt;</description></item><item><title>Linux五种IO模型</title><link>https://yshbyte.com/articles/linux-wu-zhong-io-mo-xing/</link><pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-wu-zhong-io-mo-xing/</guid><description>&lt;p&gt;前言：&#10;最近一直在研究Linux IO模型，Linux IO模型是一个挺复杂的概念，分析Linux IO模型一定要注意方法，否则会在一个个概念中，迷失自我。&lt;/p&gt;</description></item><item><title>图解Linux poll机制，终于集齐IO复用三剑客（精华篇）</title><link>https://yshbyte.com/articles/tu-jie-linux-poll-ji-zhi-zhong-yu-ji-qi-io-fu-yo/</link><pubDate>Thu, 23 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-poll-ji-zhi-zhong-yu-ji-qi-io-fu-yo/</guid><description>&lt;p&gt;前言：&#10;前面几篇文章已经详细讲解了Linux select和epoll机制，select和epoll两种IO复用方式用的人比较多，就像一家人一样，epoll相当于大哥，select相当于弟弟，而poll相当于二哥，家里的老二通常是很容易被忽视的对象，poll这种IO复用方式也很容易被忽视。epoll机制效率高，适用于高并发场景，所以epoll机制广泛用于各种开源项目。select机制编程简单，如果对高并发没有需求，那么很多人会选择select机制做多路IO请求处理。poll机制既没有高并发能力，编程也并不简单，所以经常吃灰。这篇文章通过图文详解Linux poll实现原理，目的是让大家能够从本质了解poll机制，以及对三种IO多路复用方式有一个全面的了解，最后根据自己的业务需求，选择合适的IO复用机制。&lt;/p&gt;</description></item><item><title>图解Linux select机制_从内核到应用（精华篇）</title><link>https://yshbyte.com/articles/tu-jie-linux-select-ji-zhi-cong-nei-he-dao-ying/</link><pubDate>Mon, 20 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-select-ji-zhi-cong-nei-he-dao-ying/</guid><description>&lt;p&gt;前言：&lt;/p&gt;&#10;&lt;p&gt;select机制已经被很多人都讲解过，select使用起来也不是特别难，为什么还要花时间再次讲解select机制？&lt;/p&gt;&#10;&lt;p&gt;在回答这个问题之前，我们先问一下自己，是否有足够的信心保证在使用select编程时不出错，select机制虽然看起来简单，实际在使用时有很多坑，当我们没有从原理上真正理解select机制时，我们随时会掉入这些坑，所以这篇文章我尽量把select实现原理和细节交待清楚。&lt;/p&gt;</description></item><item><title>一篇文章让你真正搞懂epoll机制</title><link>https://yshbyte.com/articles/yi-pian-wen-zhang-rang-ni-zhen-zheng-gao-dong-ep/</link><pubDate>Wed, 15 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-pian-wen-zhang-rang-ni-zhen-zheng-gao-dong-ep/</guid><description>&lt;h2 id="1epoll简介"&gt;1.epoll简介&lt;/h2&gt;&#10;&lt;p&gt;epoll是Linux内核为处理大批量文件描述符而作了改进的poll，它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。&lt;/p&gt;</description></item><item><title>你真的懂Linux线程和信号的关系吗？</title><link>https://yshbyte.com/articles/ni-zhen-de-dong-linux-xian-cheng-he-xin-hao-de-g/</link><pubDate>Mon, 13 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/ni-zhen-de-dong-linux-xian-cheng-he-xin-hao-de-g/</guid><description>&lt;p&gt;前言：&lt;/p&gt;&#10;&lt;p&gt;讲到信号，我们更多的是站在进程的角度去理解信号，当一个进程有多个线程的时候，那么进程，线程，信号三者之间会是什么样的关系呢？&lt;/p&gt;&#10;&lt;h2 id="1线程与信号的关系"&gt;1.线程与信号的关系&lt;/h2&gt;&#10;&lt;p&gt;线程与信号关系要遵循以下标准：&lt;/p&gt;</description></item><item><title>Linux进程调度之完全公平调度（压箱底的干货分享）</title><link>https://yshbyte.com/articles/linux-jin-cheng-diao-du-zhi-wan-quan-gong-ping-d/</link><pubDate>Mon, 06 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-jin-cheng-diao-du-zhi-wan-quan-gong-ping-d/</guid><description>&lt;h2 id="1什么是完全公平调度"&gt;1.什么是完全公平调度？&lt;/h2&gt;&#10;&lt;p&gt;完全公平调度，CFS (Completely Fair Scheduler) 是 Linux 内核中的一个调度算法，用于管理进程的调度和时间片分配。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;CFS 的设计理念是以红黑树作为进程队列的数据结构，其中每个进程都有一个红黑树节点。这些节点按照进程的虚拟运行时间排序，时间较少的进程在树的左节点，而运行时间较长的进程位于树的右节点。调度器每次选择红黑树最左边（最小虚拟运行时间）的节点来运行。&lt;/p&gt;</description></item><item><title>图解Linux进程优先级</title><link>https://yshbyte.com/articles/tu-jie-linux-jin-cheng-you-xian-ji/</link><pubDate>Sat, 04 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-jin-cheng-you-xian-ji/</guid><description>&lt;h2 id="1什么是进程优先级"&gt;1.什么是进程优先级？&lt;/h2&gt;&#10;&lt;p&gt;Linux进程的优先级是用来确定在多个进程同时运行时，哪个进程会获得更多的CPU时间片。&lt;/p&gt;&#10;&lt;p&gt;Linux进程的优先级分为实时优先级和普通优先级。&lt;/p&gt;&#10;&lt;p&gt;实时优先级用于实时应用程序，如硬实时任务和实时控制系统，而普通优先级用于非实时应用程序。&lt;/p&gt;</description></item><item><title>图解Linux内核调度系统</title><link>https://yshbyte.com/articles/tu-jie-linux-nei-he-diao-du-xi-tong/</link><pubDate>Fri, 03 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tu-jie-linux-nei-he-diao-du-xi-tong/</guid><description>&lt;h2 id="1进程调度系统"&gt;1.进程调度系统&lt;/h2&gt;&#10;&lt;p&gt;Linux进程调度是操作系统内核中的一个重要组成部分，它负责决定哪个进程可以在CPU上运行。&lt;/p&gt;&#10;&lt;p&gt;进程调度的目标是合理分配CPU资源，提高系统的整体运行效率和响应能力。&lt;/p&gt;</description></item><item><title>标准IO_格式化IO之printf函数</title><link>https://yshbyte.com/articles/biao-zhun-io-ge-shi-hua-io-zhi-printf-han-shu/</link><pubDate>Thu, 02 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/biao-zhun-io-ge-shi-hua-io-zhi-printf-han-shu/</guid><description>&lt;h2 id="1可变参数原理"&gt;1.可变参数原理&lt;/h2&gt;&#10;&lt;h3 id="11-函数参数入栈原理"&gt;1.1 函数参数入栈原理&lt;/h3&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/biao-zhun-io-ge-shi-hua-io-zhi-printf-han-shu/b7f384e02a0f.png" alt="标准IO_格式化IO之printf函数 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1-1 函数参数入栈原理&lt;/p&gt;&#10;&lt;p&gt;函数参数采用从右至左的方式入栈，最右的参数从栈顶入栈，以此类推，每个参数都会存储在栈中，形成一个函数参数列表。&lt;/p&gt;</description></item><item><title>Linux内核是如何创建进程？</title><link>https://yshbyte.com/articles/linux-nei-he-shi-ru-he-chuang-jian-jin-cheng/</link><pubDate>Wed, 01 Nov 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/linux-nei-he-shi-ru-he-chuang-jian-jin-cheng/</guid><description>&lt;h2 id="1linux如何创建进程"&gt;1.Linux如何创建进程&lt;/h2&gt;&#10;&lt;p&gt;Linux创建进程都是通过父进程克隆的方式实现。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;子进程刚创建成功时，虚拟地址空间和父进程虚拟地址空间信息一样（即代码和数据都是一样）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;通过调用exec家族函数可以替换虚拟地址空间信息为新的程序的信息。&lt;/p&gt;</description></item><item><title>一文弄懂Linux信号机制</title><link>https://yshbyte.com/articles/yi-wen-nong-dong-linux-xin-hao-ji-zhi/</link><pubDate>Tue, 31 Oct 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-wen-nong-dong-linux-xin-hao-ji-zhi/</guid><description>&lt;h2 id="1什么是信号"&gt;1.什么是信号？&lt;/h2&gt;&#10;&lt;p&gt;Linux信号机制是进程间通信的一种方式，用于在不同进程之间传递信息。它通过向目标进程发送一个特定的信号，来触发目标进程执行相应的处理操作。&lt;/p&gt;</description></item><item><title>一文搞懂Linux线程和进程区别？</title><link>https://yshbyte.com/articles/yi-wen-gao-dong-linux-xian-cheng-he-jin-cheng-qu/</link><pubDate>Mon, 30 Oct 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/yi-wen-gao-dong-linux-xian-cheng-he-jin-cheng-qu/</guid><description>&lt;h2 id="1什么是线程"&gt;1.什么是线程？&lt;/h2&gt;&#10;&lt;p&gt;线程其实就是轻量级进程（LWP）。&lt;/p&gt;&#10;&lt;p&gt;轻量级进程（Light Weight Process）是指在操作系统级别上，将一个进程划分为多个执行单元，每个执行单元拥有自己的堆栈、程序计数器和资源使用情况，但共享同一进程的地址空间和文件描述符等资源。这些执行单元通常被称为线程（Thread）或者轻量级进程。&lt;/p&gt;</description></item><item><title>UDP校验和（checksum）原理</title><link>https://yshbyte.com/articles/udp-jiao-yan-he-checksum-yuan-li/</link><pubDate>Sun, 23 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/udp-jiao-yan-he-checksum-yuan-li/</guid><description>&lt;h2 id="1校验和原理"&gt;1.校验和原理&lt;/h2&gt;&#10;&lt;h3 id="11-校验和计算"&gt;1.1 校验和计算&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;校验数据以16bit为单位进行累加求和，校验数据需为偶数字节，奇数字节末尾填充0变为偶数字节。&lt;/li&gt;&#10;&lt;li&gt;如果累加和超过16bit，产生了进位，需将高16bit和低16bit累加求和。&lt;/li&gt;&#10;&lt;li&gt;循环步骤2，直至未产生进位为止。&lt;/li&gt;&#10;&lt;li&gt;累加和取反得到校验和。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="12-校验和验证"&gt;1.2 校验和验证：&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;校验数据16bit为单位进行累加求和，校验数据需为偶数字节，奇数字节末尾填充0变为偶数字节。&lt;/li&gt;&#10;&lt;li&gt;如果累加和超过16bit，产生了进位，需将高16bit和低16bit累加求和。&lt;/li&gt;&#10;&lt;li&gt;循环步骤2，直至未产生进位为止。&lt;/li&gt;&#10;&lt;li&gt;累加和和校验和相加得到0xffff，校验成功，否则失败。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2udp校验和原理"&gt;2.UDP校验和原理&lt;/h2&gt;&#10;&lt;h3 id="21-udp校验数据范围"&gt;2.1 UDP校验数据范围&lt;/h3&gt;&#10;&lt;p&gt;范围：UDP伪首部（12字节） + UDP首部（8字节） + UDP负载数据。&lt;/p&gt;</description></item><item><title>数据链路层原始套接字</title><link>https://yshbyte.com/articles/shu-ju-lian-lu-ceng-yuan-shi-tao-jie-zi/</link><pubDate>Sun, 16 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/shu-ju-lian-lu-ceng-yuan-shi-tao-jie-zi/</guid><description>&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/shu-ju-lian-lu-ceng-yuan-shi-tao-jie-zi/9f2a536aacf7.png" alt="数据链路层原始套接字 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1什么是数据链路层原始套接字"&gt;1.什么是数据链路层原始套接字？&lt;/h2&gt;&#10;&lt;p&gt;数据链路层原始套接字是Linux内核提供的一种套接字，该套接字可以让用户程序直接发送和接收以太网数据，用户程序发送和接收的数据包必须是完整的以太网数据，内核不会再处理该数据而只是做一些简单的接收和发送工作。数据链路层原始套接字在实际环境中有很多的应用，比如可以用来监听和抓包，可以对数据包进行修改和定制等等，很多的开源软件也用到了原始套接字。&#10;基于原始套接字这样的特性，可能会被一些不法分子利用，所以大家在使用原始套接字的时候，需要注意网络安全问题。&lt;/p&gt;</description></item><item><title>网络层原始套接字</title><link>https://yshbyte.com/articles/wang-luo-ceng-yuan-shi-tao-jie-zi/</link><pubDate>Fri, 14 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/wang-luo-ceng-yuan-shi-tao-jie-zi/</guid><description>&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/wang-luo-ceng-yuan-shi-tao-jie-zi/b89e518c2063.png" alt="网络层原始套接字 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1什么是原始套接字"&gt;1.什么是原始套接字？&lt;/h2&gt;&#10;&lt;p&gt;原始套接字（sock_raw）分为链路层原始套接字和网络层原始套接字，今天讨论的是网络层原始套接字，后续原始套接字指的是网络层原始套接字。网络层原始套接字提供了一个方法或者说工具，用户可以使用该工具完成IP层数据包的组装，包括IP头部，传输层头部（TCP头部，UDP头部）和负载数据的组装，原始套接字可以跳过内核的数据包组包和分包流程，直接发送和接收数据包。&lt;/p&gt;</description></item><item><title>IO复用之epoll</title><link>https://yshbyte.com/articles/io-fu-yong-zhi-epoll/</link><pubDate>Wed, 12 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/io-fu-yong-zhi-epoll/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/io-fu-yong-zhi-epoll/261c5ecba193.png" alt="IO复用之epoll 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="1epoll基础简介"&gt;1.epoll基础简介&lt;/h2&gt;&#10;&lt;h3 id="11-相关函数介绍"&gt;1.1 相关函数介绍&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;epoll_create函数&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;epoll_create函数用于创建epoll文件描述符，该文件描述符用于后续的epoll操作，参数size目前还没有实际用处，我们只要填一个大于0的数就行。&lt;/p&gt;</description></item><item><title>IO复用之poll</title><link>https://yshbyte.com/articles/io-fu-yong-zhi-poll/</link><pubDate>Sun, 09 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/io-fu-yong-zhi-poll/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/io-fu-yong-zhi-poll/c0eb2a91216f.png" alt="IO复用之poll 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1poll介绍"&gt;1.poll介绍&lt;/h2&gt;&#10;&lt;h3 id="11-poll函数"&gt;1.1 poll函数&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;poll.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;pollfd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;nfds_t&lt;/span&gt; &lt;span class="n"&gt;nfds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;参数：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fds：监听事件结构体数组&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nfds：监听事件结构体数组长度&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timeout：等于-1：一直阻塞&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;等于0：立即返回&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;大于0：等待超时时间，单位毫秒&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;返回值：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;出错：返回-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;超时：返回0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;成功：返回生效监听事件个数&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="12-struct-pollfd-结构体"&gt;1.2 struct pollfd 结构体&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;pollfd&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;revents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fd：监听文件描述符&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;events：监听事件集合&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;revents：返回事件集合结果&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="13-events和revents事件定义"&gt;1.3 events和revents事件定义&lt;/h3&gt;&#10;&lt;p&gt;头文件：&amp;lt;poll.h&amp;gt;&lt;/p&gt;</description></item><item><title>IO复用之select</title><link>https://yshbyte.com/articles/io-fu-yong-zhi-select/</link><pubDate>Fri, 07 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/io-fu-yong-zhi-select/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/io-fu-yong-zhi-select/409f78ec0712.png" alt="IO复用之select 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1函数介绍"&gt;1.函数介绍&lt;/h2&gt;&#10;&lt;h3 id="11-select函数"&gt;1.1 select函数&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/select.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/time.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;nfds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;readfds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;writefds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;exceptfds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;timeval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;参数：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nfds：最大文件描述符+1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;readfds：读文件描述符集合，可设置为NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;writefds：写文件描述符集合，可设置为NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;exceptfds：异常文件描述符集合，可设置为NULL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timeout：超时时间，设置为NULL为阻塞模式&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;返回值：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;成功：返回检测到的文件描述符数量&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;失败：返回-1，设置errno&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;超时：返回0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="12-位图操作函数"&gt;1.2 位图操作函数&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/select.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/time.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//设置fd对应位图位置为0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;FD_CLR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//判断fd对应位图位置是否为1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;FD_ISSET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//设置fd对应位图位置为1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;FD_SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//整个位图清零&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;FD_ZERO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fd_set&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;set&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;select位图工作原理&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/io-fu-yong-zhi-select/c04187d908d5.png" alt="IO复用之select 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;</description></item><item><title>TCP编程基础</title><link>https://yshbyte.com/articles/tcp-bian-cheng-ji-chu/</link><pubDate>Thu, 06 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tcp-bian-cheng-ji-chu/</guid><description>&lt;p&gt;知识地图&#10;&lt;img src="https://yshbyte.com/uploads/tcp-bian-cheng-ji-chu/b14da5cbe5f1.png" alt="TCP编程基础 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1tcp通信基本流程"&gt;1.TCP通信基本流程&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tcp-bian-cheng-ji-chu/460a234db7d9.png" alt="TCP编程基础 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1&lt;/p&gt;&#10;&lt;h2 id="2示例程序"&gt;2.示例程序&lt;/h2&gt;&#10;&lt;h3 id="21-服务端程序"&gt;2.1 服务端程序&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define LISTEN_BACKLOG (5)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define BUF_SIZE (1500)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define ACK_STR &amp;#34;ack ok&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./server 本端ip 本端端口&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ip:port-&amp;gt;%s:%u&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socket error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inet_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bind error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LISTEN_BACKLOG&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;listen error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;new_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;accept error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recv len:%d, %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;%s:%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ACK_STR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;send len:%d %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-客户端程序"&gt;2.2 客户端程序&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;fcntl.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define LISTEN_BACKLOG (5)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define BUF_SIZE (1500)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define REQUEST_STR &amp;#34;tcp pack&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./client 对端ip 对端端口&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ip:port-&amp;gt;%s:%u&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socket error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inet_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;connect error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;%s:%d&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REQUEST_STR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;seq&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;send %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;send_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;BUF_SIZE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recv %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sock_fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3调试"&gt;3.调试&lt;/h2&gt;&#10;&lt;h3 id="31-编译"&gt;3.1 编译&lt;/h3&gt;&#10;&lt;p&gt;服务端&lt;/p&gt;</description></item><item><title>UDP编程基础</title><link>https://yshbyte.com/articles/udp-bian-cheng-ji-chu/</link><pubDate>Wed, 05 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/udp-bian-cheng-ji-chu/</guid><description>&lt;h2 id="知识地图"&gt;知识地图&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/udp-bian-cheng-ji-chu/5f198deb96ac.jpg" alt="UDP编程基础 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1udp通信基本流程"&gt;1.UDP通信基本流程&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/udp-bian-cheng-ji-chu/490a2a995bc7.jpg" alt="UDP编程基础 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1&lt;/p&gt;&#10;&lt;h2 id="2示例程序"&gt;2.示例程序&lt;/h2&gt;&#10;&lt;h3 id="21-服务端程序"&gt;2.1 服务端程序&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/uio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;assert.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define MAX_BUF_LEN (1500)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define ACK_STR &amp;#34;udp ack ok&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./server 本端ip 本端端口&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ip:port-&amp;gt;%s:%u&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_DGRAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socker error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inet_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;bind error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;recvfrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recvfrom peer len:%d, peer ip:port-&amp;gt;%s:%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;inet_ntoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;ntohs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recvfrom len:%d, %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sendto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ACK_STR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ACK_STR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sendto len:%d, %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ACK_STR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-客户端程序"&gt;2.2 客户端程序&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;netinet/in.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bits/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/uio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define MAX_BUF_LEN (1500)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#define REQUEST_STR &amp;#34;udp pack&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;./client 对端ip 对端端口&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*********************************&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;argc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_in&lt;/span&gt; &lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argc&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;atoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;ip:port-&amp;gt;%s:%u&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SOCK_DGRAM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;perror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;socker error&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_family&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;s_addr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inet_addr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;htons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sendto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REQUEST_STR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;strlen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REQUEST_STR&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;sendto len:%d, %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;REQUEST_STR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;memset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;recvfrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MAX_BUF_LEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recvfrom peer len:%d, peer ip:port-&amp;gt;%s:%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;inet_ntoa&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_addr&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;ntohs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;peer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin_port&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;recvfrom len:%d, %s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;recv_buf&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3调试"&gt;3.调试&lt;/h2&gt;&#10;&lt;h3 id="31-编译"&gt;3.1 编译&lt;/h3&gt;&#10;&lt;p&gt;服务端命令&#10;#gcc server.c -o server&lt;/p&gt;</description></item><item><title>套接字核心</title><link>https://yshbyte.com/articles/tao-jie-zi-he-xin/</link><pubDate>Tue, 04 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tao-jie-zi-he-xin/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-he-xin/b80c5a79c8ba.png" alt="套接字核心 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1套接字软件架构"&gt;1.套接字软件架构&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-he-xin/bdd48efa2591.png" alt="套接字核心 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;通过domain地址域对套接字进行分类，分为：IPv4套接字，IPv6套接字，域套接字，数据链路套接字等。&lt;/li&gt;&#10;&lt;li&gt;通过type套接字类型和protocol协议类型进行子分类，如IPv4套接字分为：TCP套接字，UDP套接字，ICMP套接字，原始套接字。字段prot和ops决定套接字行为。&lt;/li&gt;&#10;&lt;li&gt;不同的套接字有不同的行为，学习套接字编程需要学习各个套接字行为。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2核心函数"&gt;2.核心函数&lt;/h2&gt;&#10;&lt;h3 id="21-socket函数"&gt;2.1 socket函数&lt;/h3&gt;&#10;&lt;p&gt;socket函数创建socket对象，创建文件描述符，将socket对象映射至文件描述符private_data字段，socket对象会根据type和protocol参数动态设置socket对象行为。&lt;/p&gt;</description></item><item><title>套接字接收函数系列</title><link>https://yshbyte.com/articles/tao-jie-zi-jie-shou-han-shu-xi-lie/</link><pubDate>Mon, 03 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tao-jie-zi-jie-shou-han-shu-xi-lie/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-jie-shou-han-shu-xi-lie/637217638fb8.png" alt="套接字接收函数系列 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;1 系统调用流程&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-jie-shou-han-shu-xi-lie/cecaa122c5b5.png" alt="套接字接收函数系列 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1&lt;/p&gt;&#10;&lt;h2 id="2接收函数系列"&gt;2.接收函数系列&lt;/h2&gt;&#10;&lt;h3 id="21-recv函数"&gt;2.1 recv函数&lt;/h3&gt;&#10;&lt;p&gt;套接字接收函数。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/types.h&amp;gt; &lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="nf"&gt;recv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;参数：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sockfd：套接字文件描述符&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;buf：接收缓冲区&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;len：接收数据长度&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flags：标识&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;返回值：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;成功：返回接收的字节数&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;失败：返回-1，并设置errno&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-recvfrom函数"&gt;2.2 recvfrom函数&lt;/h3&gt;&#10;&lt;p&gt;套接字接收函数，能够获取对端套接字地址信息。&lt;/p&gt;</description></item><item><title>套接字发送函数系列</title><link>https://yshbyte.com/articles/tao-jie-zi-fa-song-han-shu-xi-lie/</link><pubDate>Sun, 02 Apr 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tao-jie-zi-fa-song-han-shu-xi-lie/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-fa-song-han-shu-xi-lie/eeee46a33035.png" alt="套接字发送函数系列 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1系统调用流程"&gt;1.系统调用流程&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-fa-song-han-shu-xi-lie/c9cc43019104.png" alt="套接字发送函数系列 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图 1&lt;/p&gt;&#10;2 发送函数系列2.1 send函数 send函数为套接字发送函数，需套接字进行connect操作才能使用。&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;# include &amp;lt;sys/types.h&amp;gt;#include &amp;lt;sys/socket.h&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;参数：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sockfd：套接字文件描述符&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;buf：发送缓冲区&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;len：发送数据长度&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;返回值：&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;成功：返回发送的字节数&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;失败：返回-1，并设置errno&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-sendto函数"&gt;2.2 sendto函数&lt;/h3&gt;&#10;&lt;p&gt;sendto函数为套接字发送函数，不管套接字是否进行connect操作都能使用。&lt;/p&gt;</description></item><item><title>套接字函数</title><link>https://yshbyte.com/articles/tao-jie-zi-han-shu/</link><pubDate>Thu, 30 Mar 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tao-jie-zi-han-shu/</guid><description>&lt;p&gt;知识地图&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-han-shu/a0fca0be9c9c.png" alt="套接字函数 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-han-shu/f8402272ffb2.png" alt="套接字函数 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;h2 id="1字节序转换函数"&gt;1.字节序转换函数&lt;/h2&gt;&#10;&lt;h3 id="11-头文件"&gt;1.1 头文件&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;arpa/inet.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="12-16位转换函数"&gt;1.2 16位转换函数&lt;/h3&gt;&#10;&lt;p&gt;uint16_t htons(uint16_t hostshort);&#10;参数：&#10;hostshort 16位无符号整型（主机字节序）&#10;返回值：&#10;16位无符号整型数（网络字节序）&#10;作用：&#10;16位无符号整型（主机字节序）转16位无符号整型（网络字节序）&lt;/p&gt;</description></item><item><title>套接字地址</title><link>https://yshbyte.com/articles/tao-jie-zi-di-zhi/</link><pubDate>Mon, 27 Mar 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tao-jie-zi-di-zhi/</guid><description>&lt;h2 id="1套接字地址介绍"&gt;1.套接字地址介绍&lt;/h2&gt;&#10;&lt;h3 id="11-通用套接字地址"&gt;1.1 通用套接字地址&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sys/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;sa_family&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;sa_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-di-zhi/386e17955697.png" alt="套接字地址 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图1解析： sa_family：2字节地址族sa_data：14字节填充&lt;/p&gt;&#10;&lt;p&gt;作用：作为套接字函数参数使用&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;accept&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="nf"&gt;sendto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dest_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;ssize_t&lt;/span&gt; &lt;span class="nf"&gt;recvfrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;sockfd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;flags&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src_addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;socklen_t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;addrlen&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="12-新的通用套接字地址"&gt;1.2 新的通用套接字地址&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;bits/socket.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;sockaddr_storage&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;short&lt;/span&gt; &lt;span class="n"&gt;ss_family&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;__ss_padding&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;118&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;__ss_align&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tao-jie-zi-di-zhi/43ff49041c68.png" alt="套接字地址 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;</description></item><item><title>TCP四次挥手</title><link>https://yshbyte.com/articles/tcp-si-ci-hui-shou/</link><pubDate>Thu, 23 Mar 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tcp-si-ci-hui-shou/</guid><description>&lt;h2 id="1四次挥手"&gt;1.四次挥手&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tcp-si-ci-hui-shou/3284d455c26d.png" alt="TCP四次挥手 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;第一次挥手&lt;/p&gt;&#10;&lt;p&gt;客户端发送FIN报文&lt;/p&gt;&#10;&lt;p&gt;FIN标识：1，seq(序号)：M&lt;/p&gt;&#10;&lt;p&gt;作用：客户端准备释放TCP连接并通知服务端，客户端主动关闭TCP连接&lt;/p&gt;&#10;&lt;p&gt;第二次挥手&lt;/p&gt;</description></item><item><title>主机字节序和网络字节序</title><link>https://yshbyte.com/articles/zhu-ji-zi-jie-xu-he-wang-luo-zi-jie-xu/</link><pubDate>Wed, 22 Mar 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/zhu-ji-zi-jie-xu-he-wang-luo-zi-jie-xu/</guid><description>&lt;h2 id="1什么是字节序"&gt;1.什么是字节序？&lt;/h2&gt;&#10;&lt;p&gt;字节序，字节在内存中排列顺序&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;计算机存储数据方式是从内存增长方向存储&lt;/li&gt;&#10;&lt;li&gt;网络发送数据从内存低地址开始发送&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/zhu-ji-zi-jie-xu-he-wang-luo-zi-jie-xu/cbbbc945433d.png" alt="主机字节序和网络字节序 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图1：计算机存储方式&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/zhu-ji-zi-jie-xu-he-wang-luo-zi-jie-xu/62ec5bdd7262.png" alt="主机字节序和网络字节序 图2" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p class="fig-caption"&gt;图2：网络发送数据方式&lt;/p&gt;&#10;&lt;h2 id="2大端字节序和小端字节序"&gt;2.大端字节序和小端字节序&lt;/h2&gt;&#10;&lt;p&gt;大端字节序（Big Endian）：按照内存的增长方向，高位字节存储在低位内存地址中小端字节序（Little Endian）：按照内存的增长方向，低位字节存储于低位内存地址中&lt;/p&gt;</description></item><item><title>TCP三次握手</title><link>https://yshbyte.com/articles/tcp-san-ci-wo-shou/</link><pubDate>Tue, 21 Mar 2023 00:00:00 +0000</pubDate><guid>https://yshbyte.com/articles/tcp-san-ci-wo-shou/</guid><description>&lt;p&gt;三次握手&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://yshbyte.com/uploads/tcp-san-ci-wo-shou/22dafdf0e87e.png" alt="TCP三次握手 图1" loading="lazy" decoding="async"&gt;&#10;&lt;/p&gt;&#10;&lt;p&gt;第一次握手：客户端发送SYN报文&lt;/p&gt;&#10;&lt;p&gt;SYN标识:1，seq(序号):X&lt;/p&gt;&#10;&lt;p&gt;第二次握手：服务端发送SYN+ACK报文&lt;/p&gt;&#10;&lt;p&gt;SYN标识:1，ACK标识:1，seq(序号):Y，ack(确认号):X+1&lt;/p&gt;</description></item></channel></rss>