【Linux】Socket编程基础
文章目录
- 字节序
- 字节序转化函数
- 套接字
- socket通用结构体
- 通信类型
- 名空间
- 套接字函数
- socket():创建套接字
- bind()函数:绑定服务器套接字与其地址、端口
- listen()函数:侦听客户连接
- connect():连接服务器套接字
- accept()函数:服务器阻塞等待接受连接,并为该连接返回一个新的套接字描述符
- send()函数:发送数据
- recv()函数:接收数据
- close():释放套接字
- 补充
字节序
- 多个字节在内存中的存放顺序,分为小端字节序和大端字节序,小端字节序时数据的低位存储在内存的低位,而大端字节序则是数据的高位存储在内存的高位。
- 网络字节序都是大端字节序,网络通信前都要将主机字节序转化成网络字节序。
字节序转化函数
#include <arpa/inet.h> // 或者 <netinet/in.h>// 将主机字节序转换为网络字节序(大端),32位转IP,16位转端口。
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);// 将网络字节序转换为主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);//将点分十进制形式的IP地址字符串转换为相应的网络字节序。
int inet_pton(int af, const char *src, void *dst);
//af: 地址族,可以是 AF_INET(IPv4)或 AF_INET6(IPv6)。
//src: 包含IP地址的点分十进制字符串。
//dst:用于存放转换后的网络字节序二进制IP地址。
//成功转换IPv4/IPv6地址时返回1,当输入的字符串不是有效的IP地址时返回0,发生错误时返回-1。/即将网络字节序转换为点分十进制字符串形式。
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);
//af: 地址族,同样可以是AF_INET 或 AF_INET6。
//src: 指向要转换的网络字节序的指针。
//dst: 用于存放转换后字符串的缓冲区。
//size: 目标缓冲区的大小。
返回值:
//成功时返回指向转换后字符串的指针。如果发生错误(如缓冲区太小),则返回NULL。
套接字
socket通用结构体
- sockaddr_in结构体是较为广泛使用的结构体,用于表示IPv4的网络地址信息,包括IP地址和端口号。
- 网络通信前都要将本地字节序转化为网络字节序,接收后需要将网络字节序再转化为本地字节序。
#include <netinet/in.h>struct sockaddr_in {short sin_family; // 16位地址族,对于IPv4应设为AF_INETunsigned short sin_port; // 16位端口号,使用网络字节序struct in_addr sin_addr; // 32位IP地址,实际上是一个in_addr结构体,其中s_addr来存放char sin_zero[8]; // 未使用,通常填充为0
};//使用
struct sockaddr_in saddr;
saddr.sin_family=AF_INET;
inet_pton(AF_INET, "127.0.0.1", &saddr.sin_addr.s_addr); // 将点分十进制IP地址转换为二进制存入sin_addr
saddr.sin_port=htons(6666);// 设置端口号,使用htons转换字节序
通信类型
通信类型控制套接字如何传输和处理数据,数据以包的形式传输
- 连接类型/流式:确保所有包依序传输,丢包则重传
- 数据报类型:不保证包的按序到达,可能会丢失
名空间
- 本地名空间:套接字地址为普通地址名,使用在本地通信
- 网络名空间:套接字地址由Internet地址和端口号(区分一台主机上多个套接字)确定,使用在网络通信
套接字函数
socket():创建套接字
- 原型:int socket(int domain,int type,int protocal);
- 参数:名空间、通信类型、协议
- 名空间:AF/PF_LOCAL(本地名空间)、AF/PF_INET(网络名空间-ipv4)
- 通信类型:SOCK_STREAM(连接类型/流式)、SOCK_DGRAM(数据报类型)
- 协议:0,系统自动选择协议,有IPPROTO_TCP或IPPROTO_UDP
- 返回值:套接字描 述符,失败返回-1
bind()函数:绑定服务器套接字与其地址、端口
- 原型:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- 参数:sockfd为服务端创建的套接字文件描述符,addr指向一个地址结构包含服务器本身的地址以及端口号,addrlen为结构体addr的长度
listen()函数:侦听客户连接
- 原型:int listen(int sockfd, int backlog);
- 参数:sockfd为已绑定IP地址和端口号的套接字描述符、backlog指定有多少个挂起连接可以进入队列,超出该值的连接将被抛弃。
connect():连接服务器套接字
- 创建两个套接字的连接,客户发起系统调用,申请与服务器建立连接
- 原型:int connect(int sockfd,const struct sockaddr* addr,socklen_t addrlen);
- 参数:sockfd为客户端创建的套接字文件描述符,addr指向一个地址结构包含服务器绑定的地址以及端口号,addrlen为结构体addr的长度
- 返回值:0成功、-1失败
accept()函数:服务器阻塞等待接受连接,并为该连接返回一个新的套接字描述符
- 原型:int accept(int sockfd, struct sockaddr *addr, socklen_t addrlen);
- 参数:sockfd为监听状态的套接字描述符、addr指向一个地址结构,用来接收客户端的地址,addrlen为结构体addr长度
- 返回值:成功返回新创建的、与客户端连接的套接字描述符,失败返回-1
- 原先套接字文件描述符可以继续接受新连接
send()函数:发送数据
- 用途:send() 函数用于在已连接的套接字上发送数据,常用于TCP套接字。它允许程序向网络连接的另一端发送数据。
ssize_t send(int socket, const void *buffer, size_t length, int flags);//成功发送的字节数,如果发送失败,返回 -1。//socket: 整型变量,表示发送数据的套接字描述符。这个描述符是由 socket() 函数创建并通过 connect() 函数(对于客户端)或者 accept() 函数(对于服务器端)准备好的。//buffer: 指向要发送数据的缓冲区的指针。//length: 要发送数据的字节数,以字节为单位。//flags: 用于控制操作的标志,可以是0或以下标志的组合。常用的标志有:
/*
MSG_DONTROUTE: 不查找路由表,直接发送到本地网络接口。
MSG_OOB: 发送带外数据。
MSG_NOSIGNAL: 禁止 SIGPIPE 信号的生成,当对端关闭连接时,本端继续发送数据将不会收到这个信号,默认行为是进程会收到 SIGPIPE 信号并终止。
*/
recv()函数:接收数据
ssize_t recv(int socket, void *buffer, size_t length, int flags);//成功时,recv() 返回实际接收到的字节数。失败返回-1//socket: 整型变量,表示接收数据的套接字描述符。必须是通过 socket() 函数创建并经过 connect()(客户端)或 accept()(服务器端)的套接字。//buffer: 指向缓冲区的指针。//length: 指定缓冲区的大小。//flags: 选项标志,用于控制接收操作的行为。常见的标志有:
/*
MSG_PEEK: 查看数据但不将其从接收缓冲区中移除,可用于非破坏性地检查数据。
MSG_DONTWAIT: 非阻塞操作,如果当前没有数据可读,立即返回,而不是阻塞等待。
其他系统特定的标志。
*/
close():释放套接字
- int close(int fd);
补充
- 套接字描述符实则就是一种特殊的文件描述符,所以也可以使用文件的读写操作来进行即使用read()、write()
- 在网络通信中,通过文件描述符来发送和接收数据,实际上网络通信中的文件描述符标识的是一个缓冲区,分为发送缓冲区和接收缓冲区,发送方发送数据实际上是先发送到发送方的发送缓冲区,再发送到接收方的接收缓冲区,接收数据则是从接收缓冲区读取数据。
相关文章:
【Linux】Socket编程基础
文章目录 字节序字节序转化函数 套接字socket通用结构体通信类型名空间套接字函数socket():创建套接字bind()函数:绑定服务器套接字与其地址、端口listen()函数:侦听客户连接connect():连接服务器套接字accept()函数:服…...
关于stm32的软件复位
使用软件复位的目的: 软件复位并不会擦除存储器中的数据,它只是将处理器恢复到复位状态,即中断使能位被清除,系统寄存器被重置,但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) ,对…...
规范系统运维:系统性能监控与优化的重要性与实践
在当今这个高度信息化的时代,企业的IT系统运维工作显得尤为关键。其中,系统性能监控和优化是运维工作中不可或缺的一环。本文旨在探讨规范系统运维中系统性能监控与优化的重要性,并分享一些实践经验和策略。 一、系统性能监控与优化的重要性…...
用python编撰一个电脑清理程序
自制一个电脑清理程序,有啥用呢?在电脑不装有清理软件的时候,可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…...
2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析
题库来源:安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的,天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…...
【Python数据挖掘实战案例】机器学习LightGBM算法原理、特点、应用---基于鸢尾花iris数据集分类实战
一、引言 1、简要介绍数据挖掘的重要性和应用 在数字化时代,数据已经成为企业和社会决策的重要依据。数据挖掘作为一门交叉学科,结合了统计学、机器学习、数据库技术和可视化等多个领域的知识,旨在从海量数据中提取有价值的信息,…...
使用LabVIEW进行大数据数组操作的优化方法
针对大数据量数组操作,传统的内存处理方法可能导致内存不足。通过LabVIEW的图像批处理技术,可以有效地进行大数据数组操作,包括分块处理、并行处理和内存优化等。这种方法能显著提高处理效率和系统稳定性。 图像批处理的优势 内存优化&#…...
【Linux】(五)—— SSH远程登录和XShell使用
SSH Linux中的SSH(Secure Shell)是一个强大的网络协议,用于在不安全的网络环境中提供安全的远程登录和资料拷贝等其他网络服务。以下是有关Linux中SSH的关键点和操作指南: SSH的基础概念 安全性:SSH通过对所有传输的…...
前端怎么实现跨域请求?
前端实现跨域请求(Cross-Origin Resource Sharing, CORS)通常涉及到后端服务器的配置,因为浏览器的同源策略(Same-Origin Policy)会阻止前端代码直接发起跨域请求。然而,有几种方法可以在前端和后端的配合下…...
sqlmap直接嗦 dnslog注入 sqllibs第8关
dnslog注入是解决注入的时候没有回显的情况,通过dns外带来进行得到我们想要的数据。 我们是用了dns解析的时候会留下记录,这时候就可以看见我们想要的内容。 这个时候我们还要了解unc路径以及一个函数load_file()以及concat来进行注入。看看我的笔记 unc…...
数据结构笔记 3 串 数组 广义表
以下了解即可,暂时没发现有什么考点 参考: 【数据结构】——多维数组和广义表_数据结构loc-CSDN博客 相对应的题目: 他这个数组不是从0开始的,是从1开始的,所以为了配合公式要减1 下面这道题又不一样,它是…...
SpringCloud微服务GateWay网关使用与配置
一、概念 1、什么是GateWay网关 在微服务架构中,Gateway(网关)是一个重要的组件,负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能: 路由: Gateway负责将来自客户端的…...
win7补丁下载
目的 一般来说,安装上windows系统就带着补丁了,但有时,安装的是原始版的操作系统是不带补丁的,一般直接更新就可以了,但有时,电脑不能联网,只能通过安装包进行升级,所以下面介绍如何…...
在Cisco Packet Tracer上配置NAT
目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上,通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置,以加…...
Web前端工程师的前景:挑战与机遇并存
Web前端工程师的前景:挑战与机遇并存 随着互联网的飞速发展和数字化转型的深入推进,Web前端工程师的前景日益广阔且充满挑战。作为互联网技术的核心力量之一,前端工程师的角色越来越重要,但同时也面临着技术更新迅速、市场需求多…...
MySQL—多表查询—联合查询
一、引言 之前学习了连接查询。现在学习联合查询。 union:联合、联盟 对于union查询,就是把多次查询的结果合并起来,形成一个新的查询结果集 涉及到两个关键字:union 和 union all 注意: union 会把上面两个SQL查询…...
2024 Jiangsu Collegiate Programming Contest E. Divide 题解 主席树
Divide 题目描述 Given an integer sequence a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1,a2,…,an of length n n n. For an interval a l , … , a r a_l,\ldots,a_r al,…,ar in this sequence, a Reduce operation divides the maximum value of the inter…...
C# WPF入门学习主线篇(十五)—— DockPanel布局容器
C# WPF入门学习主线篇(十五)—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中,我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…...
基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真,包括电机,SVPWM模块,矢量控制器模块等。 2.系统仿真结果 3.核心程序与模…...
Linux操作系统:Zookeeper在虚拟环境下的安装与部署
将 Zookeeper 安装到指定目录 // 将zookeeper解压到安装目录 $ tar –zxvf zookeeper-3.4.10.tar.gz –C /usr/local $ mv /usr/local/zookeeper-3.4.10.tar.gz /usr/local/zookeeper 设置 zookeeper 配置文件 // 创建 data 数据目录 $ mkdir /usr/local/zookeeper/data // …...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式
pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图,如果边框加在dom上面,pdf-lib导出svg的时候并不会导出边框,所以只能在echarts图上面加边框 grid的边框是在图里…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...
以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...
