Linux C/C++编程-网络程序架构与套接字类型

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客
《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

Linux系统与编程技术_夏天又到了的博客-CSDN博客

本书讲述的Linux网络编程是指用户态网络编程,Linux网络编程还包括内核态网络编程。顾名思义,用户态网络编程开发的程序都是在用户态运行的,内核态网络编程开发的程序都是在内核态运行的。实际上,内核态网络编程和用户态网络编程的概念类似,一般掌握了用户态网络编程后,实现内核态网络编程基本上就是替换一下函数形式。

Linux用户态网络编程主要基于套接字API,套接字API是Linux提供的一种网络编程接口。通过套接字API,开发人员既可以在传输层上进行网络编程,也可以跨越传输层直接对网络层进行开发。套接字API已经是用户态网络编程必须掌握的内容。套接字编程可以分为TCP套接字编程、UDP套接字编程和原始套接字编程,我们将在后面的章节分别叙述。

socket的中文称呼为套接字或套接口,是TCP/IP网络编程中的基本操作单元,可以看作不同主机进程之间相互通信的端点。套接字是应用层与TCP/IP协议簇通信的中间软件抽象层,一组接口把复杂的TCP/IP协议簇隐藏在套接字接口后面。某个主机上的某个进程通过该进程中定义的套接字可以与其他主机上同样定义了套接字的进程建立通信,传输数据。

socket起源于UNIX,在UNIX一切皆文件的哲学思想下,socket是一种“打开—读/写—关闭”模式的实现。服务器和客户端各自维护一个“文件”,在建立连接后,可以向自己的文件写入内容供对方读取或者读取对方的内容,通信结束时关闭文件。当然这只是一个大体路线,实际上编程时还有不少细节需要考虑。

无论Windows平台还是Linux平台,都对套接字实现了自己的一套编程接口。Windows下的socket实现叫Windows Socket。Linux下的实现有两套:一套是伯克利套接口(Berkeley Sockets),起源于Berkeley UNIX,这套接口很简单,得到了广泛应用,已经成为Linux网络编程事实上的标准;另一套是传输层接口(Transport Layer Interface,TLI),它是System V系统上的网络编程API,所以这套编程接口更多的是在UNIX上使用。

简单地介绍一下System V和BSD(Berkeley Software Distribution)。System V的鼻祖正是1969年AT&T开发的UNIX,随着1993年Novell收购AT&T后开放了UNIX的商标,System V的风格也逐渐成为UNIX厂商的标准。BSD的鼻祖是加州大学伯克利分校在1975年开发的BSD UNIX,后来被开源组织发展为现在众多的BSD操作系统。这里需要说明的是,Linux不能称为“标准的UNIX”而只能称为“UNIX Like”,有一部分原因就来自它的操作风格介于System V和BSD之间,而且不同的厂商为了照顾不同的用户,各个Linux发行版本的操作风格也大不相同。本书讲述的Linux网络编程都是基于Berkeley Sockets API的。

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用已实现的进程在网络中通信。socket在TCP/IP中的地位如图12-1所示。

图12-1

由图12-1可以看出,socket编程接口其实就是用户进程(应用层)和传输层之间的编程接口。

网络程序通常有两种架构,一种是B/S架构(Browser/Server,浏览器/服务器),比如我们使用火狐浏览器浏览Web网站,火狐浏览器就是一个Browser,网站上运行的Web服务器就是一个Server。这种架构的优点是用户只需要在自己计算机上安装一个网页浏览器就可以了,主要工作逻辑都在服务器上完成,减轻了用户端的升级和维护的工作量。另一种架构是C/S架构(Client/Server,客户机/服务器),这种架构要在服务器端和客户机端分别安装不同的软件,并且对于不同的应用,客户机端也要安装不同的客户机软件,有时候客户机端的软件安装或升级比较复杂,因此维护起来成本较高。这种架构的优点是可以较充分地利用两端的硬件能力,较为合理地分配任务。值得注意的是,客户机和服务器实际上是指两个不同的进程,服务器是提供服务的进程,客户机是请求服务和接收服务的进程,它们通常位于不同的主机上(也可以是同一主机上的两个进程),这些主机由网络连接,服务器端提供服务并对来自客户机端的请求做出响应。比如我们计算机上安装的QQ程序就是一个客户机端,而在腾讯公司内部还有服务端程序。

基于套接字的网络编程中,通常使用C/S架构。一个简单的客户机和服务器之间的通信过程如下:

(1)客户机向服务器提出一个请求。

(2)服务器收到客户机的请求,进行分析处理。

(3)服务器将处理的结果返回给客户机。

通常,一个服务器可以向多个客户机提供服务。因此对服务器来说,还需要考虑如何有效地处理多个客户机的请求。

在Linux系统下,有以下3种类型的套接字。

1)流套接字(SOCK_STREAM)

流套接字用于提供面向连接的、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之所以能够实现可靠的数据服务,原因在于它使用了传输控制协议,即TCP。

2)数据报套接字(SOCK_DGRAM)

数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现重复,且无法保证按顺序接收到数据。数据报套接字使用UDP进行数据的传输。由于数据报套接字不能保证数据传输的可靠性,因此有可能出现数据丢失的情况,需要在程序中做相应的处理。

3)原始套接字(SOCK_RAW)

原始套接字允许直接访问较低层次的协议,比如IP、ICMP,常用于检验新的协议实现,或者访问现有服务中配置的新设备。因为RAW_SOCKET可以自如地控制Linux下的多种协议,能够对网络底层的传输机制进行控制,所以可以应用原始套接字来操纵网络层和传输层应用。比如,我们可以通过RAW_SOCKET来接收发向本机的ICMP、IGMP协议包,或者接收TCP/IP栈不能够处理的IP包,也可以用来发送一些自定义包头或自定义协议的IP包。网络监听技术经常会用到原始套接字。

原始套接字与标准套接字(标准套接字包括流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的IP数据包,而流套接字只能读取TCP的数据,数据报套接字只能读取UDP的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

北京某新能源汽车生产及办公网络综合监控项目

北京某新能源汽车是某世界500强汽车集团旗下的新能源公司,也是国内首个获得新能源汽车生产资质、首家进行混合所有制改造、首批践行国有控股企业员工持股的新能源汽车企业,其主营业务包括纯电动乘用车研发设计、生产制造与销售服务。 项目现状 在企业全…

【LeetCode】2506、统计相似字符串对的数目

【LeetCode】2506、统计相似字符串对的数目 文章目录 一、哈希表位运算1.1 哈希表位运算 二、多语言解法 一、哈希表位运算 1.1 哈希表位运算 每个字符串, 可用一个 int 表示. (每个字符 是 int 的一个位) 哈希表记录各 字符组合 出现的次数 步骤: 遇到一个字符串, 得到 ma…

gitlab 还原合并请求

事情是这样的: 菜鸡从 test 分支切了个名为 pref-art 的分支出来,发布后一机灵,发现错了,于是在本地用 git branch -d pref-art 将该分支删掉了。之后切到了 prod 分支,再切出了一个相同名称的 pref-art 分支出来&…

Uncaught ReferenceError: __VUE_HMR_RUNTIME__ is not defined

Syntax Error: Error: vitejs/plugin-vue requires vue (>3.2.13) or vue/compiler-sfc to be present in the dependency tree. 第一步 npm install vue/compiler-sfc npm run dev 运行成功,本地打开页面是空白,控制台报错 重新下载了vue-loa…

LeetCode--排序算法(堆排序、归并排序、快速排序)

排序算法 归并排序算法思路代码时间复杂度 堆排序什么是堆?如何维护堆?如何建堆?堆排序时间复杂度 快速排序算法思想代码时间复杂度 归并排序 算法思路 归并排序算法有两个基本的操作,一个是分,也就是把原数组划分成…

vim里搜索关键字

vim是linux文本编辑器的命令,再vi的基础上做了功能增强 使用方法如下 1. / 关键字, 回车即可, 按n键查找关键字下一个位置 2.? 关键字, 回车即可, 按n键查找关键字下一个位置 3.示例

自学记录鸿蒙API 13:Calendar Kit日历功能从学习到实践

这次的目标是学习和使用HarmonyOS的Calendar Kit功能,特别是最新的API 13版本。Calendar Kit让我感受到了一种与传统开发完全不同的体验——它提供的不只是简单的日历功能,而是一套集创建、查询、更新、删除等强大能力于一体的日程管理服务。 一开始&…

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型损坏: 前挡风玻璃(damage-front-windscreen ) 损坏的门 (damaged-d…

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业,对于打算进入或转行进入该领域的人来说,制定一个清晰且系统的职业规划非常重要。2025年,网络安全领域将继续发展并面临新的挑战,包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…

如何使用 ChatGPT Prompts 写学术论文?

第 1 部分:学术写作之旅:使用 ChatGPT Prompts 进行学术写作的结构化指南 踏上学术写作过程的结构化旅程,每个 ChatGPT 提示都旨在解决特定方面,确保对您的主题进行全面探索。 制定研究问题: “制定一个关于量子计算的社会影响的研究问题,确保清晰并与您的研究目标保持一…

超大规模分类(一):噪声对比估计(Noise Contrastive Estimation, NCE)

NCE损失对应的论文为《A fast and simple algorithm for training neural probabilistic language models》,发表于2012年的ICML会议。 背景 在2012年,语言模型一般采用n-gram的方法,统计单词/上下文间的共现关系,比神经概率语言…

位置编码--RPE

相对位置编码 (Relative Position Encoding, RPE) 1. 相对位置编码 相对位置编码是 Transformer 中的一种改进位置编码方式,它的主要目的是通过直接建模序列中元素之间的相对位置,而不是绝对位置,从而更好地捕捉序列元素之间的依赖关系&#…

2024年12月31日Github流行趋势

项目名称:free-programming-books 项目地址url:https://github.com/EbookFoundation/free-programming-books项目语言:HTML历史star数:344575今日star数:432项目维护者:vhf, eshellman, davorpa, MHM5000, …

mysql下载安装及配置

基本操作参考:https://www.cnblogs.com/zhangkanghui/p/9613844.html ----------------------------------其余常见问题参考下面: 都需要管理员权限 输入命令查看端口号占用,然后kill掉

RoboMIND:多体现基准 机器人操纵的智能规范数据

我们介绍了 RoboMIND,这是机器人操纵的多体现智能规范数据的基准,包括 4 个实施例、279 个不同任务和 61 个不同对象类别的 55k 真实世界演示轨迹。 工业机器人企业 埃斯顿自动化 | 埃夫特机器人 | 节卡机器人 | 珞石机器人 | 法奥机器人 | 非夕科技 | C…

【Spring MVC 核心机制】核心组件和工作流程解析

在 Web 应用开发中,处理用户请求的逻辑常常会涉及到路径匹配、请求分发、视图渲染等多个环节。Spring MVC 作为一款强大的 Web 框架,将这些复杂的操作高度抽象化,通过组件协作简化了开发者的工作。 无论是处理表单请求、生成动态页面&#x…

郑州时空-TMS运输管理系统 GetDataBase 信息泄露漏洞复现

0x01 产品简介 郑州时空-TMS运输管理系统是一款专为物流运输企业设计的综合性管理软件,旨在提高运输效率、降低运输成本,并实现供应链的协同运作。系统基于现代计算机技术和物流管理方法,结合了郑州时空公司的专业经验和技术优势,为物流运输企业提供了一套高效、智能的运输…

电子应用设计方案81:智能AI冲奶瓶系统设计

智能 AI 冲奶瓶系统设计 一、引言 智能 AI 冲奶瓶系统旨在为父母或照顾者提供便捷、准确和卫生的冲奶服务,特别是在夜间或忙碌时,减轻负担并确保婴儿获得适宜的营养。 二、系统概述 1. 系统目标 - 精确调配奶粉和水的比例,满足不同年龄段婴…

Three.js教程004:坐标辅助器与轨道控制器

文章目录 坐标辅助器与轨道控制器实现效果添加坐标辅助器添加轨道控制器完整代码完整代码下载坐标辅助器与轨道控制器 实现效果 添加坐标辅助器 创建坐标辅助器: const axesHelper = new Three.AxesHelper(5);添加到场景中: scene.

Mesh网格数据结构2-半边结构

文章目录 1.Edge-based data Structure2.HalfEdge-Based Data Structure3. Directed-edge data structure 本文将详细介绍半边结构(Halfedge-based data),以及Face-based data,Edge-based data, Directed-edge data structure. 上…