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

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网络编程的步骤 大体上&#xff0c;连接的建立过程就是&#xff1a;服务器在确定协议类型后&#xff0c;向外广播IP地址和端口号&#xff0c;并监听等待&#xff0c;直到客户端获取了IP地址和端口号并成功连接&#xff1a; 使用socket来进行tcp协议的网络编程的大体步骤…...

uni-app封装省市区下拉组件(后台获取数据)

一.后台数据格式 PROCINCE:[{itemName:,itemValue:}] CITY:[{itemName:,itemValue}] AREA:[{itemName:,itemValue}] 前端将地址数据缓存在了pinia中 前端主要使用picker进行勾选 二.代码 <template><picker change"bindPickerChange" columnchange"…...

laravel中Mail发送邮件失败,但是没有错误信息,该如何调试?

在Laravel中&#xff0c;当使用Mail类发送邮件失败但没有错误信息显示时&#xff0c;可以按照以下步骤进行调试&#xff1a; 检查日志文件&#xff1a; Laravel会记录各种应用程序活动和错误信息。查看应用程序的日志文件&#xff0c;通常位于storage/logs目录下&#xff0c;寻…...

软考高级系统架构设计师系列论文八十五:论软件产品线技术

软考高级系统架构设计师系列论文八十五:论软件产品线技术 一、摘要二、正文三、总结一、摘要 根据“十五”国防科技重点实验室—“机载XXPD火控雷达性能开发与评估实验室”的建设需求。我所在的中国x集团公司x所电子对抗研究部组织了用于该实验室目布式联网试验,主要任务是试…...

More Effective C++学习笔记(4)

目录 条款16&#xff1a;谨记 80 - 20 法则条款17&#xff1a;考虑使用lazy evaluation&#xff08;缓式评估&#xff09;条款18&#xff1a;分期摊还预期的计算成本条款19&#xff1a;了解临时对象来源条款20&#xff1a;协助完成 “ 返回值优化 ”条款21&#xff1a;利用重载…...

概率密度函数 累积分布函数

概率密度函数&#xff1a;是指想要求得面积的图形表达式&#xff0c;注意只是表达式&#xff0c;要乘上区间才是概率&#xff0c;所以概率密度并不是概率&#xff0c;而是概率的分布程度。 为什么要引入概率密度&#xff0c;可能是因为连续变量&#xff0c;无法求出某个变量的…...

基于OpenCV实战(基础知识二)

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

PhantomJS+java 后端生成echart图表的图片

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

vue3 基础知识 ( webpack 基础知识)05

你好 文章目录 一、组件二、如何支持SFC三、webpack 打包工具四、webpack 依赖图五、webpack 代码分包 一、组件 使用组件中我们可以获得非常多的特性&#xff1a; 代码的高亮&#xff1b;ES6、CommonJS的模块化能力&#xff1b;组件作用域的CSS&#xff1b;可以使用预处理器来…...

1.4亿X区智慧城市数字平台及城市大脑(运营中心)建设项目WORD

导读&#xff1a;原文《1.4亿X区智慧城市数字平台及城市大脑&#xff08;运营中心&#xff09;建设项目WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 部分内…...

wps 画项目进度甘特图

效果如上 步骤一&#xff1a; 创建excel 表格 步骤二&#xff1a; 选中开始时间和结束时间两列数据&#xff0c;右键设置单元格格式 步骤三&#xff1a; 选择数值&#xff0c;点击确定&#xff0c;将日期转成数值。 步骤四&#xff1a;插入图表 选中任务&#xff0c;开始时间…...

【⑭MySQL | 数据类型(二)】字符串 | 二进制类型

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

Java smslib包开发

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

职业技术培训内容介绍

泰迪职业技术培训包括&#xff1a;Python技术应用、大数据技术应用、机器学习、大数据分析 、人工智能技术应用。 职业技术培训-Python技术应用 “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&…...

AUTOSAR规范与ECU软件开发(实践篇)6.2 ETAS RTA系列工具入门

目录 1、 RTA系列工具安装方法 (1) ETAS RTA-RTE的安装方法 (2) ETAS RTA-BSW的安装方法...

vue3的hooks你可以了解一下

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

面试之HTTP

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

测试框架pytest教程(3)夹具-@pytest.fixture

内置fixture Fixture使用pytest.fixture装饰&#xff0c;pytest有一些内置的fixture 命令可以查看内置fixture pytest --fixtures fixture范围 在pytest中&#xff0c;夹具&#xff08;fixtures&#xff09;具有不同的作用范围&#xff08;scope&#xff09;&#xff0c;用于…...

GNU make系列之介绍Makefile

一.欢迎来到我的酒馆 在本章节介绍Makefile。 目录 一.欢迎来到我的酒馆二.GNU make 预览三.一个简单的Makefile四.make程序如何处理Makefile文件五.在Makefile中使用变量 二.GNU make 预览 2.1 GNU make工具会自动决定哪些程序需要被重新编译&#xff0c;并且执行相应的命令来…...

Java8新特性之——方法引用

文章目录 一、简介二、举例实例方法引用&#xff08;实例对象::实例方法名&#xff09;静态方法引用&#xff08;类名::静态方法名&#xff09;类成员方法引用&#xff08;类名::实例方法名&#xff09;构造方法引用&#xff08;类名::new&#xff09;数组构造方法引用&#xf…...

Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken 官方价折扣与活动价助力个人开发者降低创新门槛 对于个人开发者和学生而言&#xff0c;探索大模型应用的最大挑战之一往往…...

构建个人AI记忆体:向量数据库与语义搜索实践指南

1. 项目概述&#xff1a;构建你的个人AI记忆体最近几年&#xff0c;AI助手越来越聪明&#xff0c;但总感觉它们“记性”不太好。你昨天刚和它聊过你家的猫叫“橘子”&#xff0c;今天再问它&#xff0c;它可能就忘了。或者&#xff0c;你让它帮你总结上周的工作周报&#xff0c…...

网盘直链下载助手:解锁九大网盘下载速度的终极方案

网盘直链下载助手&#xff1a;解锁九大网盘下载速度的终极方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘…...

为AI智能体构建持久记忆系统:Claw Recall部署与MCP集成指南

1. 项目概述&#xff1a;为AI智能体构建持久、可搜索的记忆系统如果你和我一样&#xff0c;深度使用Claude Code、OpenClaw这类AI智能体工具进行日常开发&#xff0c;那你一定遇到过这个让人头疼的问题&#xff1a;对话上下文被压缩&#xff08;Context Compaction&#xff09;…...

从AlphaGo到你的小游戏:如何用MCTS(蒙特卡洛树搜索)为你的五子棋项目加个‘智能大脑’

从AlphaGo到你的小游戏&#xff1a;如何用MCTS为五子棋项目构建智能决策引擎 当你在手机上下棋输给AI时&#xff0c;是否好奇过这些"电子大脑"如何思考&#xff1f;2016年AlphaGo击败李世石的关键技术之一——蒙特卡洛树搜索&#xff08;MCTS&#xff09;&#xff0c…...

STM32实战:手把手教你用Cubemx配置交流充电桩的CP信号检测(附代码)

STM32实战&#xff1a;从零构建充电桩CP信号检测系统 充电桩作为新能源汽车基础设施的核心组件&#xff0c;其通信协议的可靠性直接关系到充电安全。在实际工程中&#xff0c;CP&#xff08;Control Pilot&#xff09;信号的检测往往是开发者的第一个技术拦路虎。我曾在一个海外…...

MathType 快捷键实战指南——数学建模效率飙升的秘诀(从入门到精通)

1. 为什么你需要掌握MathType快捷键&#xff1f; 如果你经常需要处理数学公式&#xff0c;肯定遇到过这样的场景&#xff1a;为了输入一个简单的积分符号&#xff0c;不得不从工具栏里翻找半天&#xff1b;调整公式对齐时反复用鼠标拖动&#xff1b;修改矩阵维度时逐个单元格调…...

从pip._vendor.urllib3报错到apt-get失败:一次搞定Ubuntu网络DNS配置(附阿里云镜像加速)

从pip报错到apt-get失败&#xff1a;Ubuntu网络DNS配置全攻略 最近在Ubuntu 16.04上配置Python开发环境时&#xff0c;遇到了一个看似简单却令人头疼的问题——pip安装包时频繁报错pip._vendor.urllib3.connection.HTTPSConnection&#xff0c;紧接着发现连apt-get update也失败…...

10分钟学会Appium:移动端自动化测试的终极指南

10分钟学会Appium&#xff1a;移动端自动化测试的终极指南 【免费下载链接】til :memo: Today I Learned 项目地址: https://gitcode.com/gh_mirrors/ti/til Appium是一款功能强大的开源移动端自动化测试工具&#xff0c;支持iOS和Android平台&#xff0c;让开发者和测试…...

基于MCP架构构建营销数据管道:打通Google Ads、Meta Ads与GA4的数据孤岛

1. 项目概述&#xff1a;打通营销数据孤岛的“瑞士军刀” 如果你在数字营销领域摸爬滚打过几年&#xff0c;尤其是在同时操盘谷歌广告和Meta广告&#xff0c;并且数据后台用的是Google Analytics 4&#xff0c;那你一定对下面这个场景深恶痛绝&#xff1a;老板或客户要一份整体…...