【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 // …...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...
Python异步编程:深入理解协程的原理与实践指南
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 持续学习,不断…...
