Linux socket网络编程
一、主机字节序列和网络字节序列
主机字节序列分为大端字节序列和小端字节序列,不同的主机采用的字节序列可能不同。大端字节序列是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序列是指整数的高位字节存储在内存的高地址处,低位字节存储在内存的低地址处。在两台使用不同字节序列的主机之间传递数据时,可能会出现冲突。所以,在将数据发送到网络时规定整型数据使用大端字节序列,所以也把大端字节序列称为网络字节序列。对方接收到数据后,可以根据自己的字节序列转换。
Linux系统提供如下4个函数来完成主机字节序列和网络字节序列的转换:

二、套接字的地址结构
1.通用socket地址结构
socket网络编程接口中表示socket地址的是结构体sockaddr,定义如下:
#include<bits/socket.h>struct sockaddr
{sa_famliy_t sa_family;char sa_data[14];
}
sa_family成员是地址族(sa_famliy_t)类型的变量。地址族类型通常与协议族类型对应。常见的协议族和对应的地址族如下图所示:

2.专用socket地址结构
TCP/IP协议族有sockaddr_in和sockaddr_in6两个专用的socket地址结构,它们分别用于IPV4和IPV6,一般使用sockaddr_in:
结构体sockaddr_in它用来处理网络通信的地址,是internet环境下套接字的地址形式。
所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。sockaddr_in用于socket定义和赋值。
struct sockaddr_in
{sa_family_t sin_family;//地址族 AF_INET u_int16_t sin_port;//端口号,需要用网络字节序表示struct in_addr sin_addr;//IPV4地址结构体
}
该结构体中提到的另一个结构体 in_addr 的定义如下:
struct in_sddr
{u_int32_t s_addr;//以网络字节序列表示IPV4地址
}
它用来表示一个32位的IPv4地址。
in_addr_t 一般为 32位的unsigned int,其字节顺序为网络顺序,即该无符号整数采用大端字节序 。
3.IP地址转换函数
通常,人们习惯用点分十进制字符串表示IPV4地址,但编程中我们需要先把它们转化为整数方能使用,下面函数可用于点分十进制字符串表示的IPV4地址和网络字节序整数表示的IPV4地址之间的转换:

三、网络编程接口
1.socket()创建套接字

参数解释:
第一个参数domain:设置套接字的协议簇, AF_UNIX AF_INET AF_INET6。
第二个参数type:设置套接字的服务类型,SOCK_STREAM(流式套接字)、SOCK_DGRAM(数据报格式套接字)。
第三个参数protocol:一般设置为0,表示使用默认协议
返回值:创建成功返回套接字的文件描述符,失败返回-1 。
2.bind()服务端把用于通信的地址和端口绑定到 socket 上
参数解释:
第一个参数sockfd:需要绑定的socket描述符。
第二个参数addr:地址结构,存放了服务端用于通信的地址和端口。
第三个参数addrlen:表示 addr 结构体的大小,即socket地址的长度。
返回值:成功返回0,失败返回-1。
3.listen()创建一个监听队列以存储待处理的客户连接

参数解释:
第一个参数sockfd:被监听的socket套接字。
第二个参数backlog:表示处于完全连接状态的socket的上限。
返回值:成功返回0,失败返回-1。
4.accept()从listen监听队列中接收一个连接

参数解释:
第一个参数sockfd:是执行过listen系统调用的监听socket 。
第二个参数addr:参数用来获取被接受连接的远端socket地址。
第三个参数addrlen:指定该socket地址的长度。
返回值:成功返回一个新的连接socket,该socket唯一地标识了被接收的这个连接,失败返回-1 。
5.connect()客户端需要通过此系统调用来主动与服务器建立连接

参数解释:
第一个参数sockfd:由socket()返回的一个socket。
第二个参数serv_addr:服务器监听的socket地址。
第三个参数addrlen:指定这个地址的长度。
返回值:成功返回0,失败返回-1。
6.recv()读取sockfd上的数据(TCP读取数据)
参数解释:
第一个参数sockfd:已连接stocket的描述符。
第二个参数buff:指定读缓冲区的位置。
第三个参数len:指定读缓冲区的大小。
第四个参数flags:为数据收发提供了额外的控制。
7.send()往socket上写入数据(TCP写入数据)

参数解释:
第一个参数sockfd:已连接stocket的描述符。
第二个参数buff:指定读缓冲区的位置。
第三个参数len:指定读缓冲区的数据长度。
第四个参数flags:为数据收发提供了额外的控制。
8.close()关闭一个连接

参数解释:
参数sockfd:关闭该连接对应的socket。
相关文章:
Linux socket网络编程
一、主机字节序列和网络字节序列 主机字节序列分为大端字节序列和小端字节序列,不同的主机采用的字节序列可能不同。大端字节序列是指一个整数的高位字节存储在内存的低地址处,低位字节存储在内存的高地址处。小端字节序列是指整数的高位字节存储在内存…...
【广州华锐互动】牲畜养殖VR模拟实操系统为传统教育注入新的生命力
随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进我们的生活。在农业领域,VR技术的应用也日益广泛,为现代农业人才培养提供了新的途径。 由广州华锐互动开发的“牲畜养殖VR模拟实操系统”引起了广泛关注,系统包含了鸡、猪、牛、马…...
JavaScript基础(Dom操作)
目录 一,BOM模型1.1,BOM可实现功能 二,Window对象的常用属性2.1,Window对象的常用方法2.1-1,open()和close()方法 三,History对象四,Location对象五,Document对象的常用方法六&#…...
.NET6.0 System.Drawing.Common 通用解决办法
最近有不少小伙伴在升级 .NET 6 时遇到了 System.Drawing.Common 的问题,同时很多库的依赖还都是 System.Drawing.Common ,而 .NET 6 默认情况下只在 Windows 上支持使用,Linux 上默认不支持这就导致在 Linux 环境上使用会有问题,…...
k8s ingress (二)
k8s ingress (二) Ingress介绍 在前面课程中已经提到,Service对集群之外暴露服务的主要方式有两种:NodePort和LoadBalancer,但是这两种方式,都有一定的缺点: NodePort方式的缺点是会占用很多集群机器的端口࿰…...
如何实现element UI中table操作栏更多按钮的展示与折叠?
解决思路: 直接使用elementUI文档上Popover 弹出框组件 废话不多说,直接上代码吧 <el-table :data="locationList" v-loading="loading" border class="table" ref="multipleTable" @selection-change="handleSelecti…...
SpringBoot(二)
###SpringBoot原理分析 ###SpringBoot监控 ###SpringBoot项目部署 #SpringBoot自动配置 Condition:(条件) Condition是在Spring4.0增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作 SpringBoot是如何知道要创建…...
python脚本——批量将word文档转换成pdf文件
语言:python 3 用法:点击运行后,弹出窗口选择word文档所在文件夹,程序运行后对该文件夹下所有的word文件全部转换成pdf文件,生成的pdf文件名字与原wrod文件相同。 如运行中报错,需要自行根据报错内容按照…...
自然语言处理从入门到应用——LangChain:链(Chains)-[通用功能:链的保存(序列化)与加载(反序列化)]
分类目录:《自然语言处理从入门到应用》总目录 本文介绍了如何将链保存(序列化)到磁盘和从磁盘加载(反序列化)。我们使用的序列化格式是json或yaml。目前,只有一些链支持这种类型的序列化。随着时间的推移&…...
机器学习:开启智能时代的重要引擎
引言 随着科技的飞速发展,人工智能已经渗透到我们生活的各个领域。而在人工智能的众多领域中,机器学习以其强大的数据处理能力和智能决策能力受到了广泛关注。本文将向您介绍机器学习的概念、工作原理、应用领域以及未来的发展前景。 一、什么是机器学…...
ES搭建集群
一、创建 elasticsearch-cluster 文件夹 创建 elasticsearch-7.8.0-cluster 文件夹,在内部复制三个 elasticsearch 服务。 然后每个文件目录中每个节点的 config/elasticsearch.yml 配置文件 node-1001 节点 #节点 1 的配置信息: #集群名称࿰…...
# Lua与C++交互(二)———— 交互
C 调用lua 基础调用 再来温习一下 myName “beauty girl” C想要获取myName的值,根据规则,它需要把myName压入栈中,这样lua就能看到;lua从堆栈中获取myName的值,此时栈顶为空;lua拿着myName去全局表中查…...
机器人焊接生产线参数监控系统理解需求
机器人焊接生产线参数监控系统是以参数来反映系统状态并以直观的方式表现 出来,及时了解被监视对象的状态和状态的变化情况。其主要目标是为了达到减少 生产线的处理时间,降低故障率,缩短故障排除时间,从而提高生产线的生产效率 …...
前端基础(ES6 模块化)
目录 前言 复习 ES6 模块化导出导入 解构赋值 导入js文件 export default 全局注册 局部注册 前言 前面学习了js,引入方式使用的是<script s"XXX.js">,今天来学习引入文件的其他方式,使用ES6 模块化编程,…...
第七章,文章界面
7.1添加个人专栏 <template><div class="blog-container"><div class="blog-pages"><!-- 用于渲染『文章列表』和『文章内容』 --><router-view/><div class="col-md-3 main-col pull-left"><div cla…...
HJ102 字符统计
描述 输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。 数据范围:字符串长度满足 1≤len(str)≤1000 1≤len(str)≤1000 输入描述&a…...
Maven聚合项目(微服务项目)创建流程,以及pom详解
1、首先创建springboot项目作为父项目 只留下pom.xml 文件,删除src目录及其他无用文件 2、创建子项目 子项目可以是maven项目,也可以是springboot项目 3、父子项目关联 4、父项目中依赖管理 <?xml version"1.0" encoding"UTF-8&qu…...
Android OkHttp 源码浅析一
演进之路:原生Android框架不好用 ---- HttpUrlConnect 和 Apache HTTPClient 第一版 底层使用HTTPURLConnect 第二版 Square构建 从Android4.4开始 基本使用: val okhttp OkHttpClient()val request Request.Builder().url("http://www.baidu.com").buil…...
【Redis】——Redis基础的数据结构以及应用场景
什么是redis数据库 Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。,Redis 还支持 事务 、持久化、Lua 脚本、多种集群方案(主…...
SpringBoot+WebSocket搭建多人在线聊天环境
一、WebSocket是什么? WebSocket是在单个TCP连接上进行全双工通信的协议,可以在服务器和客户端之间建立双向通信通道。 WebSocket 首先与服务器建立常规 HTTP 连接,然后通过发送Upgrade标头将其升级为双向 WebSocket 连接。 WebSocket使得…...
DOL-CHS-MODS实战指南:从入门到精通的5个关键步骤
DOL-CHS-MODS实战指南:从入门到精通的5个关键步骤 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS 副标题:一站式解决Degrees of Lewdity汉化与Mod整合难题,让你轻…...
Windows下RedisInsight保姆级安装教程:从下载到连接Redis全流程详解
Windows平台RedisInsight全流程实战指南:从零搭建高效Redis可视化环境 Redis作为当下最流行的内存数据库之一,其强大的性能与丰富的数据结构深受开发者青睐。但在日常开发中,仅通过命令行操作Redis难免效率低下——这正是RedisInsight的价值所…...
STM32智能婴儿床系统设计与实现
基于STM32的智能婴儿床系统设计1. 项目概述1.1 系统架构本智能婴儿床系统采用模块化设计架构,以STM32F103RCT6微控制器为核心处理单元,集成多种传感器模块和执行机构。系统通过蓝牙与手机APP建立双向通信,实现环境参数监测、异常报警和远程控…...
避坑指南:C# ComboBox那些容易踩的坑(SelectedIndexChanged的诡异事件)
C# ComboBox开发避坑实战:SelectedIndexChanged的7个隐秘陷阱与解决方案 下拉框控件ComboBox看似简单,却暗藏诸多让开发者抓狂的"坑"。我曾在一个仓储管理系统中,因为ComboBox的异常行为连续加班三晚——数据绑定时的SelectedInde…...
WebGLInput:重构Unity WebGL输入体验的革命性方案
WebGLInput:重构Unity WebGL输入体验的革命性方案 【免费下载链接】WebGLInput IME for Unity WebGL 项目地址: https://gitcode.com/gh_mirrors/we/WebGLInput 在Unity WebGL开发中,输入法支持一直是开发者面临的核心挑战之一。WebGLInput项目通…...
鸣潮帧率优化指南:用WaveTools工具箱实现高流畅度游戏体验
鸣潮帧率优化指南:用WaveTools工具箱实现高流畅度游戏体验 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为鸣潮游戏中的画面卡顿、帧率不稳定而困扰吗?想要在激烈的战斗中获得…...
Three.js 3D地图实战:从GeoJSON数据到交互式可视化(附完整代码)
Three.js 3D地图实战:从GeoJSON数据到交互式可视化 当我们需要在网页上展示一个具有真实地理特征的3D地图时,Three.js无疑是最强大的工具之一。它不仅能让地图以立体的形式呈现,还能添加各种交互效果,让数据可视化变得更加生动。本…...
高效安全:从远程服务器到本地Windows的文件传输全攻略
1. 远程桌面连接:最直观的文件传输方式 远程桌面连接(RDP)是Windows系统自带的"杀手级"功能,我帮客户部署项目时90%的场景都会用它传文件。它的优势在于操作可视化程度高,就像直接在服务器桌面上操作本地文件…...
告别序列‘拉直’的暴力美学:手把手复现MaIR,体验保持图像局部与连续性的Mamba新玩法
告别序列“拉直”的暴力美学:手把手复现MaIR,体验保持图像局部与连续性的Mamba新玩法 在计算机视觉领域,图像修复任务(如去噪、超分、去模糊)一直是研究热点。传统方法往往将2D图像“拉直”为1D序列进行处理࿰…...
Qwen3-ForcedAligner-0.6B生产环境:支持日均1000+分钟音频批处理任务
Qwen3-ForcedAligner-0.6B生产环境:支持日均1000分钟音频批处理任务 1. 项目概述 Qwen3-ForcedAligner-0.6B是一款基于阿里巴巴先进语音识别技术开发的本地化智能语音转录工具。该工具采用双模型架构设计,集成了Qwen3-ASR-1.7B语音识别模型和ForcedAli…...
