Linux socket网络编程概述 和 相关API讲解
socket网络编程的步骤
大体上,连接的建立过程就是:服务器在确定协议类型后,向外广播IP地址和端口号,并监听等待,直到客户端获取了IP地址和端口号并成功连接:
使用socket来进行tcp协议的网络编程的大体步骤:
其实socket的使用就像之前文件编程中打开文件的操作一样,返回的是一个标识符,之后就对这个标识符进行操作。
相关的API讲解
参考:linux网络编程:网络socket基础编程(一) 基础API_Jags的博客-CSDN博客
socket函数
创建套接字的函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int socket(int domain, int type, int protocol);
函数参数
- domian:表示所使用的协议族,可以选取以下值中的一个:
AF_INET:IPv4因特网域 (最常用,TCP/IP的协议族)
AF_INET6:IPv6因特网域
AF_UNIX:Unix域
AF_ROUTE:路由套接字
AF_KEY:密钥套接字
AF_UNSPEC:未指定
... ...
- type:指定socket的类型,可以选取以下值中的一个:
SOCK_STREAM:字节流套接字(提供可靠,面向连接的信息流,使用TCP协议,保证了数据的正确性和顺序性)
SOCK_DGRAM:数据报套接字(提供无连接的服务,数据可以通过相互独立的报文进行传输,是无序的,并且不能保证可靠性,使用UDP协议)
SOCK_RAW:原始套接字(运行程序使用底层协议如IP或ICMP直接进行访问,功能强大但使用不便,主要用于协议的开发)
... ...
- protocol:协议的类型,通常赋值“0”,表示type类型对应的默认协议,也可以从以下值中选一个:
IPPROTO_TCP:tcp协议
IPPROTO_UDP:udp协议
IPPROTO_SCTP:sctp协议
IPPROTO_TIPC:tipc协议
... ...
- 返回值:成功则返回 监听套接字描述符,失败返回-1
bind函数(服务器)
服务器绑定IP和端口号到网络标识符的函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数参数
- sockfd:socket函数返回的 监听套接字描述符
- addr:一个结构体指针,指向 “包含有本机IP地址以及端口号” 的 “sockaddr结构体” 的指针
//ipv4(AF_INET)对应的地址结构 struct sockaddr{unsigned short as_family; //协议族char sa_data[14]; //IP+端口号 };等价于,下面这种是优化版struct sockaddr_in{sa_family_t sin_family; //协议族in_port_t sin_port; //端口号struct in_addr sin_addr; //IP地址结构体unsigned char sin_zero[8]; //填充,没有实际意义,只是为了跟socketaddr结构在内存中对齐,这样两者才能相互转换 };
- addrlen:第二个参数所指向的结构体的长度,使用 sizeof()来获取
- 返回值:成功返回0,失败返回-1
listen函数(服务器)
服务器监听设置的函数
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int listen(int sockfd, int backlog);
函数参数
- sockfd:socket函数返回的 监听套接字描述符
- backlog:指定在请求队列中允许的最大请求数
- 返回值:成功则返回0,失败返回-1
accept函数(服务器)
服务器接受连接的函数,用于从已完成连接队列的队头返回下一个已完成连接,如果已完成连接队列为空,那么进程投入睡眠
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数参数
- sockfd:socket函数返回的 监听套接字描述符
- addr:用来返回已连接的客户端的协议地址,不关心就写NULL
- addrlen:返回上一个参数对应结构体的长度,不关心就写NULL
- 返回值:成功则返回已 连接套接字描述符,失败返回-1
connect函数(客户端)
客户端连接的函数,如果是TCP套接字,调用 connect函数将激发TCP的三路握手过程
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
函数参数
- sockfd:套接字描述符
- addr:服务器端的协议地址
- addrlen:返回上一个参数对应结构体的长度
- 返回值:成功返回0,失败返回-1
inet_aton 和 inet_ntoa函数
地址转换的API
头文件
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
函数原型
int inet_aton(const char *cp, struct in_addr *inp);
//把字符串形式的“192.168.X.XXX”转为网络能识别的格式
char *inet_ntoa(struct in_addr in);
//把网络格式的IP地址转为字符串形式
函数参数1
- cp:字符串形式的IP地址
- inp:存放转化后的 网络形式的IP地址
- 返回值:成功返回1,失败返回0
函数参数2
- in:网络形式的IP地址
- 返回值:成功返回点分十进制数,失败返回NULL
read 和 write 函数
在套接字通讯中进行字节读取函数
和之前文件的的读写函数名字一样,但参数不太一样,因为在套接字的通讯中,输入或输出的字节可能比请求的少。
使用详见:使用read write 读写socket_san.hang的博客-CSDN博客
头文件
#include <unistd.h>
函数原型
ssize_t write(int fd, const void *buf, size_t nbytes);
//将buf中的nbytes个字节写入到文件描述符fd,成功时返回写的字节数
ssize_t read(int fd, void *buf, size_t nbyte);
//从fd读取nbyte个字节到buf中,返回实际所读的字节数
网络I/O还有一些函数,例如 recv()/send(); readv()/writev(); recvmsg()/sendmsg()等...
send 和 recv函数
另一组用于socket数据收发的API
头文件
#include <sys/types.h>
#include <sys/socket.h>
函数原型
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
函数参数
- sockfd:socket函数返回的 监听套接字描述符
- buf:代发数据 / 接受缓冲区
- len:数据长度
- flags:通常为0
- 返回值:成功返回 发送 / 接收 的字节数, 失败 返回-1
相关文章:

Linux socket网络编程概述 和 相关API讲解
socket网络编程的步骤 大体上,连接的建立过程就是:服务器在确定协议类型后,向外广播IP地址和端口号,并监听等待,直到客户端获取了IP地址和端口号并成功连接: 使用socket来进行tcp协议的网络编程的大体步骤…...
uni-app封装省市区下拉组件(后台获取数据)
一.后台数据格式 PROCINCE:[{itemName:,itemValue:}] CITY:[{itemName:,itemValue}] AREA:[{itemName:,itemValue}] 前端将地址数据缓存在了pinia中 前端主要使用picker进行勾选 二.代码 <template><picker change"bindPickerChange" columnchange"…...
laravel中Mail发送邮件失败,但是没有错误信息,该如何调试?
在Laravel中,当使用Mail类发送邮件失败但没有错误信息显示时,可以按照以下步骤进行调试: 检查日志文件: Laravel会记录各种应用程序活动和错误信息。查看应用程序的日志文件,通常位于storage/logs目录下,寻…...
软考高级系统架构设计师系列论文八十五:论软件产品线技术
软考高级系统架构设计师系列论文八十五:论软件产品线技术 一、摘要二、正文三、总结一、摘要 根据“十五”国防科技重点实验室—“机载XXPD火控雷达性能开发与评估实验室”的建设需求。我所在的中国x集团公司x所电子对抗研究部组织了用于该实验室目布式联网试验,主要任务是试…...

More Effective C++学习笔记(4)
目录 条款16:谨记 80 - 20 法则条款17:考虑使用lazy evaluation(缓式评估)条款18:分期摊还预期的计算成本条款19:了解临时对象来源条款20:协助完成 “ 返回值优化 ”条款21:利用重载…...
概率密度函数 累积分布函数
概率密度函数:是指想要求得面积的图形表达式,注意只是表达式,要乘上区间才是概率,所以概率密度并不是概率,而是概率的分布程度。 为什么要引入概率密度,可能是因为连续变量,无法求出某个变量的…...

基于OpenCV实战(基础知识二)
目录 简介 1.ROI区域 2.边界填充 3.数值计算 4.图像融合 简介 OpenCV是一个流行的开源计算机视觉库,由英特尔公司发起发展。它提供了超过2500个优化算法和许多工具包,可用于灰度、彩色、深度、基于特征和运动跟踪等的图像处理和计算机视觉应用。Ope…...

PhantomJS+java 后端生成echart图表的图片
PhantomJSjava 后端生成echart图表的图片 前言源码效果实现echarts-convertPhantomJS实现echarts截图得到图片java延时读取base64数据 参考 前言 该项目仅用作个人学习使用 源码 地址 docker镜像: registry.cn-chengdu.aliyuncs.com/qinjie/java-phantomjs:1.0 …...

vue3 基础知识 ( webpack 基础知识)05
你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性: 代码的高亮;ES6、CommonJS的模块化能力;组件作用域的CSS;可以使用预处理器来…...
1.4亿X区智慧城市数字平台及城市大脑(运营中心)建设项目WORD
导读:原文《1.4亿X区智慧城市数字平台及城市大脑(运营中心)建设项目WORD》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 部分内…...

wps 画项目进度甘特图
效果如上 步骤一: 创建excel 表格 步骤二: 选中开始时间和结束时间两列数据,右键设置单元格格式 步骤三: 选择数值,点击确定,将日期转成数值。 步骤四:插入图表 选中任务,开始时间…...

【⑭MySQL | 数据类型(二)】字符串 | 二进制类型
前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL字符串 | 二进制类型类型的分享✨ 目录 前言5 字符串类型6 二进制类型总结 5 字符串类型 字符串类型用来存储字符串数据,还可以存储图片和声音的二进制数据。字符串可以区分或者不区分大小写的串比…...

Java smslib包开发
上一篇文章我详细介绍RXTXcomm的安装方法和简单代码,如果小伙伴涉及到需要使用手机短信模块完成短信收发需求的话,可以使用到smslib进行开发。 首先还是同样的,将整个smslib包源码导入项目,并且将它所需依赖一起进行导入 导入完成之后,我们就可以对smslib包进行二次开发了 下面…...

职业技术培训内容介绍
泰迪职业技术培训包括:Python技术应用、大数据技术应用、机器学习、大数据分析 、人工智能技术应用。 职业技术培训-Python技术应用 “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&…...
AUTOSAR规范与ECU软件开发(实践篇)6.2 ETAS RTA系列工具入门
目录 1、 RTA系列工具安装方法 (1) ETAS RTA-RTE的安装方法 (2) ETAS RTA-BSW的安装方法...

vue3的hooks你可以了解一下
更详细的hooks了解参考这个大佬的文章:掘金:Hooks和Mixins之间的区别 刚开始我简单看了几篇文章感觉Hooks这个东西很普通,甚至感觉还不如vue2的mixin好用。还有export import 感觉和普通定义一个utils文件使用没什么区别。但是Hooks这个东西肯…...

面试之HTTP
1.HTTP与HTTPS的区别 HTTP运行在TCP之上;HTTPS是运行在SSL之上,SSL运行在TCP之上两者使用的端口不同:HTTP使用的是80端口,HTTPS使用的是443端口安全性不同:HTTP没有加密,安全性较差;HTTPS有加密…...

测试框架pytest教程(3)夹具-@pytest.fixture
内置fixture Fixture使用pytest.fixture装饰,pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中,夹具(fixtures)具有不同的作用范围(scope),用于…...

GNU make系列之介绍Makefile
一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件五.在Makefile中使用变量 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译,并且执行相应的命令来…...
Java8新特性之——方法引用
文章目录 一、简介二、举例实例方法引用(实例对象::实例方法名)静态方法引用(类名::静态方法名)类成员方法引用(类名::实例方法名)构造方法引用(类名::new)数组构造方法引用…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
Python实现简单音频数据压缩与解压算法
Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中,压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言,提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...