当前位置: 首页 > news >正文

【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()&#xff1a;创建套接字bind()函数&#xff1a;绑定服务器套接字与其地址、端口listen()函数&#xff1a;侦听客户连接connect()&#xff1a;连接服务器套接字accept()函数&#xff1a;服…...

关于stm32的软件复位

使用软件复位的目的&#xff1a; 软件复位并不会擦除存储器中的数据&#xff0c;它只是将处理器恢复到复位状态&#xff0c;即中断使能位被清除&#xff0c;系统寄存器被重置&#xff0c;但RAM和Flash存储器中的数据保持不变。 STM32软件复位(基于库文件V3.5) &#xff0c;对…...

规范系统运维:系统性能监控与优化的重要性与实践

在当今这个高度信息化的时代&#xff0c;企业的IT系统运维工作显得尤为关键。其中&#xff0c;系统性能监控和优化是运维工作中不可或缺的一环。本文旨在探讨规范系统运维中系统性能监控与优化的重要性&#xff0c;并分享一些实践经验和策略。 一、系统性能监控与优化的重要性…...

用python编撰一个电脑清理程序

自制一个电脑清理程序&#xff0c;有啥用呢&#xff1f;在电脑不装有清理软件的时候&#xff0c;可以解决自己电脑内存不足的情况。 1、设想需要删除指定文件夹中的临时文件和缓存文件。以下是代码。 import os import shutil def clean_folder(folder_path): for root,…...

2024年【天津市安全员C证】免费试题及天津市安全员C证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题是安全生产模拟考试一点通生成的&#xff0c;天津市安全员C证证模拟考试题库是根据天津市安全员C证最新版教材汇编出天津市安全员C证仿真模拟考试。2024年【天津市安全员C证】免费试题及天津市…...

【Python数据挖掘实战案例】机器学习LightGBM算法原理、特点、应用---基于鸢尾花iris数据集分类实战

一、引言 1、简要介绍数据挖掘的重要性和应用 在数字化时代&#xff0c;数据已经成为企业和社会决策的重要依据。数据挖掘作为一门交叉学科&#xff0c;结合了统计学、机器学习、数据库技术和可视化等多个领域的知识&#xff0c;旨在从海量数据中提取有价值的信息&#xff0c…...

使用LabVIEW进行大数据数组操作的优化方法

针对大数据量数组操作&#xff0c;传统的内存处理方法可能导致内存不足。通过LabVIEW的图像批处理技术&#xff0c;可以有效地进行大数据数组操作&#xff0c;包括分块处理、并行处理和内存优化等。这种方法能显著提高处理效率和系统稳定性。 图像批处理的优势 内存优化&#…...

【Linux】(五)—— SSH远程登录和XShell使用

SSH Linux中的SSH&#xff08;Secure Shell&#xff09;是一个强大的网络协议&#xff0c;用于在不安全的网络环境中提供安全的远程登录和资料拷贝等其他网络服务。以下是有关Linux中SSH的关键点和操作指南&#xff1a; SSH的基础概念 安全性&#xff1a;SSH通过对所有传输的…...

前端怎么实现跨域请求?

前端实现跨域请求&#xff08;Cross-Origin Resource Sharing, CORS&#xff09;通常涉及到后端服务器的配置&#xff0c;因为浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;会阻止前端代码直接发起跨域请求。然而&#xff0c;有几种方法可以在前端和后端的配合下…...

sqlmap直接嗦 dnslog注入 sqllibs第8关

dnslog注入是解决注入的时候没有回显的情况&#xff0c;通过dns外带来进行得到我们想要的数据。 我们是用了dns解析的时候会留下记录&#xff0c;这时候就可以看见我们想要的内容。 这个时候我们还要了解unc路径以及一个函数load_file()以及concat来进行注入。看看我的笔记 unc…...

数据结构笔记 3 串 数组 广义表

以下了解即可&#xff0c;暂时没发现有什么考点 参考&#xff1a; 【数据结构】——多维数组和广义表_数据结构loc-CSDN博客 相对应的题目&#xff1a; 他这个数组不是从0开始的&#xff0c;是从1开始的&#xff0c;所以为了配合公式要减1 下面这道题又不一样&#xff0c;它是…...

SpringCloud微服务GateWay网关使用与配置

一、概念 1、什么是GateWay网关 在微服务架构中&#xff0c;Gateway&#xff08;网关&#xff09;是一个重要的组件&#xff0c;负责处理外部请求并将它们路由到适当的微服务。以下是Gateway在微服务中的一些主要功能&#xff1a; 路由&#xff1a; Gateway负责将来自客户端的…...

win7补丁下载

目的 一般来说&#xff0c;安装上windows系统就带着补丁了&#xff0c;但有时&#xff0c;安装的是原始版的操作系统是不带补丁的&#xff0c;一般直接更新就可以了&#xff0c;但有时&#xff0c;电脑不能联网&#xff0c;只能通过安装包进行升级&#xff0c;所以下面介绍如何…...

在Cisco Packet Tracer上配置NAT

目录 前言一、搭建网络拓扑1.1 配置PC机1.2 配置客户路由器1.3 配置ISP路由器 二、配置NAT2.1 在客户路由器中配置NAT2.2 测试是否配置成功 总结 前言 本篇文章是在了解NAT的原理基础上&#xff0c;通过使用Cisco Packet Tracer 网络模拟器实现模拟对NAT的配置&#xff0c;以加…...

Web前端工程师的前景:挑战与机遇并存

Web前端工程师的前景&#xff1a;挑战与机遇并存 随着互联网的飞速发展和数字化转型的深入推进&#xff0c;Web前端工程师的前景日益广阔且充满挑战。作为互联网技术的核心力量之一&#xff0c;前端工程师的角色越来越重要&#xff0c;但同时也面临着技术更新迅速、市场需求多…...

MySQL—多表查询—联合查询

一、引言 之前学习了连接查询。现在学习联合查询。 union&#xff1a;联合、联盟 对于union查询&#xff0c;就是把多次查询的结果合并起来&#xff0c;形成一个新的查询结果集 涉及到两个关键字&#xff1a;union 和 union all 注意&#xff1a; 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入门学习主线篇&#xff08;十五&#xff09;—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中&#xff0c;我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…...

基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于SVPWM矢量控制的无速度传感器电机控制系统simulink建模与仿真&#xff0c;包括电机&#xff0c;SVPWM模块&#xff0c;矢量控制器模块等。 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 // …...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益&#xff08;IG&#xff09; 分类器设计贝叶斯理论&#xff1a;线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别&#xff0c; 有单标签多类别文本分类和多…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言&#xff1a;本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中&#xff0c;跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南&#xff0c;你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案&#xff0c;并结合内网…...