Socket 编程 TCP(准备阶段) - 指南

news/2025/10/24 16:38:22/文章来源:https://www.cnblogs.com/lxjshuju/p/19163741

目录

TCP socket API 详解

socket():

bind():

listen():

accept():

先铺垫:TCP 通信的 “饭店经营逻辑”

accept 的返回值:“专门服务单个客人的服务员”

用饭店场景拆解:

关键对比:老板 vs 服务员(原始套接字 vs accept 返回的新套接字)

举个实际场景:

一句话总结:

connect


TCP socket API 详解

下面介绍工具中会用到的 socket API,这些函数都在 sys/socket.h 头文件中。

socket():

  • socket()打开一个网络通讯端口,假设成功的话,就像 open()一样返回一个文档描述符;
  • 应用程序可以像读写文件一样用 read/write 在网络上收发数据;
  • 如果 socket()调用出错则返回-1;
  • 对于 IPv4, family 参数指定为 AF_INET;
  • 对于 TCP 协议,type 参数指定为 SOCK_STREAM, 表示面向流的传输协议
  • protocol 参数的介绍从略,指定为 0 即可。

bind():

  • 服务器程序所监听的网络地址和端口号通常是固定不变的,客户端程序得知服务器程序的地址和端口号后就可能向服务器发起连接; 服务器需要调用 bind 绑定一个固定的网络地址和端口号;
  • bind()成功返回 0,失败返回-1。
  • bind()的作用是将参数 sockfd 和 myaddr 绑定在一起, 使 sockfd 这个用于网络通讯的文件描述符监听 myaddr 所描述的地址和端口号;
  • 我们在udp的时候讲过,struct sockaddr *是一个通用指针类型,myaddr 参数实际上可以接受多种协议的 sockaddr 结构体,而它们的长度各不相同,所以需要第三个参数 addrlen 指定结构体的长度;

我们的程序中对 myaddr 参数是这样初始化的:

  1. 将整个结构体清零;
  2. 设置地址类型为 AF_INET;
  3. 网络地址为 INADDR_ANY, 该宏表示本地的任意 IP 地址,由于服务器可能有多个网卡,每个网卡也可能绑定多个 IP 地址, 这样设置可以在所有的 IP 地址上监听, 直到与某个客户端建立了连接时才确定下来到底用哪个 IP 地址;
  4. 端口号为 SERV_PORT, 我们定义为 8888,也就是在允许范围内可自定义;

listen():

  • listen()声明 sockfd 处于监听状态, 并且最多允许有 backlog 个客户端处于连接等待状态, 假如接收到更多的连接请求就忽略, 这里设置不会太大(一般是 5);
  • listen()成功返回 0,失败返回-1;

accept():

  • 三次握手结束后, 服务器调用 accept()接受连接;
  • 如果服务器调用 accept()时还没有客户端的连接请求,就阻塞等待直到有客户端连接上来;
  • addr 是一个传出参数,accept()返回时传出客户端的地址和端口号;
  • 如果给 addr 参数传 NULL,表示不关心客户端的地址;
  • addrlen 参数是一个传入传出参数(value-result argument), 传入的是调用者提供的, 缓冲区 addr 的长度以避免缓冲区溢出问题, 传出的是客户端地址结构体的实际长度(有可能没有占满调用者提供的缓冲区);

我们的服务器程序结构是这样的:

理解 accecpt 的返回值: 饭店拉客例子

用 “饭店拉客” 的场景类比 HTTP 中的 Accept 请求头和返回值,能非常直观地理解其核心逻辑 ——核心是区分 “招揽客人的老板” 和 “服务具体客人的服务员”。。

先铺垫:TCP 通信的 “饭店经营逻辑”

在 TCP 服务器编程中,socketbindlistenaccept 是一套 “开店流程”:

  1. socket():租下一间店面(创建套接字,是通信的基础 “资源”)。
  2. bind():给店面挂上门牌(绑定 IP 和端口,让客人知道去哪找你)。
  3. listen():打开店门、安排老板在门口拉客(进入 “监听状态”,等待客人上门)。
  4. accept():老板接到客人,喊来一个服务员专门伺候这位客人(核心动作,对应返回值的意义)。

accept 的返回值:“专门服务单个客人的服务员”

accept 函数的原型核心可以简化理解为:int accept(int 老板的编号, ...);

它的返回值是一个新的套接字描述符通过(能够理解为 “服务员的工号”),这个返回值的本质是:为 “刚刚上门的单个客户端” 创建的专属通信通道

用饭店场景拆解:
  • 参数里的 “老板”(listen 状态的套接字):老板的职责只有一个 —— 在门口监听、等待客人上门(对应 listen 后的套接字,只负责接收客户端的 connect 连接请求)。老板不直接服务客人,他的 “工号”(原始套接字描述符)是固定的,一直用于 “拉新客”。

  • 返回值的 “服务员”(新的套接字):当有客人(客户端)走到门口(发起 connect),老板(accept 函数)会做两件事:

    这个服务员(新套接字)的唯一作用,就是和这位特定客人单独通信—— 客人点单(客户端发数据,用 recv 读取)、服务员上菜(服务器发数据,用 send 发送),全程不影响老板继续在门口拉其他客人(原始套接字仍在监听新请求)。

    1. 确认 “客人要进店消费”(建立 TCP 连接的三次握手);
    2. 喊来一个专属服务员(返回新的套接字描述符),并告诉服务员:“这位客人交给你了,全程负责他的点单、上菜、结账”。
关键对比:老板 vs 服务员(原始套接字 vs accept 返回的新套接字)
角色对应套接字核心职责生命周期
老板listen 后的原始套接字只负责在门口监听、接收新连接请求贯穿整个服务器运行期间
服务员accept 返回的新套接字只负责和单个客户端的全程数据交互客户端断开连接后就 “下班”(关闭)

举个实际场景:

假设你开了一家 TCP 饭店(服务器):

  1. 老板(原始套接字 sockfd=3)在门口挂好门牌(bind127.0.0.1:8080),打开门(listen)等待客人。
  2. 客人 A 上门(connect 请求),accept(sockfd, ...) 返回 new_sockfd=4(服务员 4 号)—— 服务员 4 号专门服务客人 A,负责他的所有需求。
  3. 同时,客人 B 也上门了,accept(sockfd, ...) 又返回 new_sockfd=5(服务员 5 号)—— 服务员 5 号专门服务客人 B,和服务员 4 号的工作互不干扰。
  4. 老板(sockfd=3)自始至终都在门口,继续等客人 C、D……

一句话总结:

accept 的返回值,就是 TCP 服务器为 “刚接进来的单个客户端” 分配的专属通信 “服务员”—— 它是后续和这个客户端收发数据的唯一 “接口”,而原始的监听套接字会继续负责 “拉新客”。

connect

  • 客户端应该调用 connect()连接服务器;
  • connect 和 bind 的参数形式一致, 区别在于 bind 的参数是自己的地址, 而 connect 的参数是对方的地址;
  • connect()成功返回 0,出错返回-1;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/945461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025 年亚克力板材厂家联系方式推荐:江苏金穗技术工艺与工程案例解析,泳池 / 鱼缸 / 海洋馆解决方案

行业背景 2025 年全球亚克力板市场规模将达 45 亿美元,中国市场规模预计突破 300 亿元,华东地区产量占比超 40%。随着高端化与定制化需求提升,市场对亚克力板材的透光性、厚板加工及异形定制能力提出更高要求。但行…

2025 年 亚克力透明泳池厂家联系方式推荐:江苏金穗的技术积淀与工程服务优势解析

行业背景 随着文旅地产、高端民宿及别墅市场的蓬勃发展,亚克力透明泳池因兼具视觉观赏性与空间艺术性,需求持续攀升。但行业现存诸多痛点:部分厂家透光率不足影响观景效果,厚板加工与无缝拼接技术欠缺导致漏水隐患…

2025山东单招综评培训机构推荐榜:济南易升教育五星领跑,小班培养 + 高上岸率适配升学需求

随着单招综评成为升学重要路径,2025 年山东地区一批专注该领域的教育机构凭借硬实力脱颖而出。以下推荐榜基于真实办学成果与服务能力筛选,为考生提供客观参考。 济南易升教育学校(易升权合教育) 🌟🌟🌟🌟…

实用指南:npm 包构建与发布

实用指南:npm 包构建与发布pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

2025修护/二硫化硒去屑/香氛/控油蓬松/洗发水品牌推荐榜:MASIL 玛丝兰(西安悦己容)五星领衔,这些专研洗护品牌值得关注

在洗护市场愈发注重 “专业养护” 的 2025 年,兼具技术实力与用户口碑的洗发水品牌成为主流选择。以下推荐榜基于企业真实实力与产品定位筛选,为消费者提供客观参考。 西安悦己容生物科技有限责任公司(MASIL 玛丝兰…

2025年Q345B/20G/5310/无缝钢管 高压/5310高压/6479高压合金管推荐榜:天津大无缝五星领跑,这些品质流通企业适配工业需求

2025 年工业制造、能源输送等领域对无缝钢管、合金管的品质稳定性与供应效率要求持续提升,一批兼具资源整合能力与服务意识的企业凸显,以下推荐榜基于真实经营实力筛选,供采购参考。 天津大无缝联合钢铁有限公司 �…

2025年保险法律服务律所推荐:拒赔点外险保险律师聚焦专业与实战能力的权威之选

随着保险产品日益多元,理赔纠纷、条款争议等问题频发,选择专业的保险法律服务机构成为化解矛盾的关键。基于案件胜诉率、领域专注度、服务覆盖范围等核心维度,结合行业实践与客户反馈,现梳理出值得关注的保险律师事…

vue3+vite学习日记之配置全新项目

一、先创建项目并进行一些安装配置 1、npm create vite@latest ->输入项目名称->选择vue->选择ts->根据提示进行 2、安装vue-router,输入命令npm install vue-router@4 -s 3、安装element-plus,输入命令…

2025 全案/VI/品牌设计公司服务商推荐:意识形体(上海意感)五星领跑,这些专注视觉价值的公司值得选

在商业竞争愈发依赖 “视觉话语权” 的当下,品牌设计成为传递品牌内核、激活用户连接的关键。2025 年,一批以专业设计能力驱动品牌成长的服务商凸显,以下推荐榜聚焦真实实力,为品牌方提供参考。 上海意感品牌形象策…

2025 年水泥房厂家联系方式推荐,内蒙古蒙营新型建材提供预制水泥房及配套产品专业解决方案

行业背景 随着我国城镇化进程的推进和建筑行业工业化转型加速,预制水泥制品凭借施工效率高、质量稳定、节能环保等优势,在市政建设与民用建筑领域的应用愈发广泛。其中,预制水泥房因具备组装便捷、空间利用率高、使…

一网统管,智慧赋能:国标GB28181算法算力平台EasyGBS构建城市交通可视、巡检与指挥新范式

一网统管,智慧赋能:国标GB28181算法算力平台EasyGBS构建城市交通可视、巡检与指挥新范式一、方案背景 人车暴涨,路口告急:高峰堵、事故慢、取证难,老办法已拖不动城市交通。破局之道,先看摄像头——国标GB28181算…

YouTube数据抓取漏洞利用与概念验证解析

本文详细解析了YouTube数据抓取概念验证项目的技术实现,包括Python代码编写、GitHub CoPilot辅助开发、YouTube API数据采集以及CSV文件生成等关键技术细节,展示了完整的数据抓取技术架构。https://sploitus.com/exp…

2025 年检查井厂家联系方式推荐,内蒙古蒙营新型建材提供专业检查井解决方案与可靠产品供应

在当前市政建设与民用建筑快速发展的背景下,检查井作为排水、电力、通信等系统的关键配套设施,其质量与供应稳定性直接影响工程整体质量和使用寿命。随着行业对检查井的规格标准化、性能可靠化要求不断提升,市场对专…

oracle 控制文件

1、查看控制文件SQL> show parameter controlNAME TYPE VALUE------------------------------------ ----------- ------------------------------control_file_record_kee…

iOS 26 查看电池容量与健康状态 多工具组合的工程实践

本文聚焦 iOS 26 查看电池容量与健康状态,介绍如何结合 KeyMob(克魔)、iMazing、Xcode Instruments、Console 等工具,建立多层监控体系,分析电池容量、循环次数、能耗趋势、App 功耗分布与版本差异,实现系统化的…

完整教程:数据类型和变量1

完整教程:数据类型和变量1pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

2025年苏州中式秀禾服婚纱照公司权威推荐榜单:海边婚纱照/园林婚纱照/旅拍婚纱照源头公司精选

传统与时尚的完美融合,苏州秀禾服婚纱照正成为新人的文化新宠。 中式秀禾服婚纱照以其吉祥寓意与精致工艺,正成为苏州婚纱摄影市场的新趋势。据《2025苏州婚庆行业白皮书》数据显示,每年约有12万对新人在苏州拍摄婚…

mssqsl靶机的sa权限sql注入-cnblog

靶机系统 windows server 2025 数据库 Microsoft sql server 2022 服务器 Internet Information Services (IIS) 10最关键的一点 在sql注入中 我们将用xp_cmdshell创建一个用户 这就要求sqlserver服务用管理员账户登录…

国产9GHz宽带巴伦HT-BAL-0009SMG实测反馈——pin-to-pin替代海外料,EVM直接降4个点

国产9GHz宽带巴伦HT-BAL-0009SMG实测反馈——pin-to-pin替代海外料,EVM直接降4个点仪表实测 网络分析仪扫零点到九千兆,回波全程大于十二分贝,插损低于三点五分贝。相位平衡实测正负零点六度,幅度平衡零点一二分贝…

Python---合成视频不能正常播放的原因

在使用Python进行视频快速合并的时候,如果视频的编码格式、码率等这些不一致,就会导致合并的视频:播放异常。 提问豆包AI:结果:使用 ffmpeg 的 -c copy(流复制)模式快速拼接视频时,出现音频静音、播放速度异常…