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)数组构造方法引用…...
Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛 对于个人开发者和学生而言,探索大模型应用的最大挑战之一往往…...
构建个人AI记忆体:向量数据库与语义搜索实践指南
1. 项目概述:构建你的个人AI记忆体最近几年,AI助手越来越聪明,但总感觉它们“记性”不太好。你昨天刚和它聊过你家的猫叫“橘子”,今天再问它,它可能就忘了。或者,你让它帮你总结上周的工作周报,…...
网盘直链下载助手:解锁九大网盘下载速度的终极方案
网盘直链下载助手:解锁九大网盘下载速度的终极方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...
为AI智能体构建持久记忆系统:Claw Recall部署与MCP集成指南
1. 项目概述:为AI智能体构建持久、可搜索的记忆系统如果你和我一样,深度使用Claude Code、OpenClaw这类AI智能体工具进行日常开发,那你一定遇到过这个让人头疼的问题:对话上下文被压缩(Context Compaction)…...
从AlphaGo到你的小游戏:如何用MCTS(蒙特卡洛树搜索)为你的五子棋项目加个‘智能大脑’
从AlphaGo到你的小游戏:如何用MCTS为五子棋项目构建智能决策引擎 当你在手机上下棋输给AI时,是否好奇过这些"电子大脑"如何思考?2016年AlphaGo击败李世石的关键技术之一——蒙特卡洛树搜索(MCTS),…...
STM32实战:手把手教你用Cubemx配置交流充电桩的CP信号检测(附代码)
STM32实战:从零构建充电桩CP信号检测系统 充电桩作为新能源汽车基础设施的核心组件,其通信协议的可靠性直接关系到充电安全。在实际工程中,CP(Control Pilot)信号的检测往往是开发者的第一个技术拦路虎。我曾在一个海外…...
MathType 快捷键实战指南——数学建模效率飙升的秘诀(从入门到精通)
1. 为什么你需要掌握MathType快捷键? 如果你经常需要处理数学公式,肯定遇到过这样的场景:为了输入一个简单的积分符号,不得不从工具栏里翻找半天;调整公式对齐时反复用鼠标拖动;修改矩阵维度时逐个单元格调…...
从pip._vendor.urllib3报错到apt-get失败:一次搞定Ubuntu网络DNS配置(附阿里云镜像加速)
从pip报错到apt-get失败:Ubuntu网络DNS配置全攻略 最近在Ubuntu 16.04上配置Python开发环境时,遇到了一个看似简单却令人头疼的问题——pip安装包时频繁报错pip._vendor.urllib3.connection.HTTPSConnection,紧接着发现连apt-get update也失败…...
10分钟学会Appium:移动端自动化测试的终极指南
10分钟学会Appium:移动端自动化测试的终极指南 【免费下载链接】til :memo: Today I Learned 项目地址: https://gitcode.com/gh_mirrors/ti/til Appium是一款功能强大的开源移动端自动化测试工具,支持iOS和Android平台,让开发者和测试…...
基于MCP架构构建营销数据管道:打通Google Ads、Meta Ads与GA4的数据孤岛
1. 项目概述:打通营销数据孤岛的“瑞士军刀” 如果你在数字营销领域摸爬滚打过几年,尤其是在同时操盘谷歌广告和Meta广告,并且数据后台用的是Google Analytics 4,那你一定对下面这个场景深恶痛绝:老板或客户要一份整体…...
