网络编程day1——进程间通信-socket套接字

        基本特征:socket是一种接口技术,被抽象了一种文件操作,可以让同一计算机中的不同进程之间通信,也可以让不同计算机中的进程之间通信(网络通信)

    本地进程间通信编程模型:

        进程A                                                        进程B

    创建socket对象                                    创建socket对象

    准备通信地址(本地socket文件)            准备通信地址

    绑定sokect对象和地址                           ...

    监听                                                       ...                

    等待连接                                               连接

    接收\发送数据                                       发送\接收数据

    关闭socket                                            关闭socket

    删除socket文件

   

    注意:底层需要借助socket文件,才能进行同一计算机不同进程的通信

    注意:每一步骤的返回值一定要判断 否则不知道是哪一步出问题

创建socket对象

 int socket(int domain, int type, int protocol);功能:创建socket对象

    domain:

        AF_UNIX/AF_LOCAL   本地通信,进程间通信

        AF_INET            基于IPv4地址通信

        AF_INET6           基于IPv6地址通信

    type:

        SOCK_STREAM     数据流协议 //TCP

        SOCK_DGRAM      数据报协议 //UDP

    protocol:

        特殊通信协议,一般不用,写0即可

    返回值:成功返回socket描述符,失败返回-1  

绑定socket和通信地址

 int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:绑定socket和通信地址(文件路径\网络地址)

     sockfd:socket描述符

     addr:通信地址结构体

        实际使用传递的地址结构体 sockaddr_un或者sockaddr_in,但是传参时要把它们转换成sockaddr,因为C语言没有自建类型的自动类型识别,因此要强转 //C++有自动类型识别转换

        //本地通信使用

        #include <sys/un.h>

        struct sockaddr_un {

            __kernel_sa_family_t sun_family; // 地址簇domain写啥它写啥

            char sun_path[UNIX_PATH_MAX];   // socket文件路径 (文件路径给新的  会自动帮你创建文件)

        };

        //  网络通信时使用

        #include <netinet/in.h>

        struct sockaddr_in {

        __kernel_sa_family_t  sin_family; //地址簇domain写啥它写啥

        __be16        sin_port;   // 端口号

        struct in_addr    sin_addr;   // IP地址结构体

        };

        struct in_addr {

            __be32  s_addr;     //  IP地址数据

        };

    addrlen:地址结构体的字节数,用于区分是sockaddr_in还是sockaddr_un

    返回值:成功0 失败-1

监听绑定好的socket

 int listen(int sockfd, int backlog);功能:监听已经绑定好的socket

    sockfd:socket描述符

    backlog:监听等待连接的排队数量 默认最大128

    //等待连接有个排队队列  backlog是指队列满了之后还可以额外排队的数量 随便写5

    返回值:成功0 失败-1  //监听成功才能等待连接

等待连接

 int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);功能:等待连接

    sockfd:socket描述符

    addr:获取连接者的地址,不想获取可以给NULL   //本地连接基本不用获取

    addrlen:获取连接者的通信地址结构体字节数,不想获取可以给NULL

    返回值:成功返回一个针对该连接的新的socket描述符,失败返回-1 //接下去通信需要用这个新的socket描述符

    注意:

        1、如果没有连接,那么该函数会阻塞等待

        2、如果要获取连接者的地址,后面两个参数都需要传递

        3、addrlen要获取时,先要给addrlen传递addr的字节数,才能获取连接者的ip

连接

 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);功能:连接socket

    sockfd:socket描述符

    addr:目标地址  //建立连接

    addrlen:目标地址结构体的字节数

    返回值:成功0 失败-1

发送数据

 ssize_t send(int sockfd,const void *buf,size_t len,int flags);功能:向建立连接之后的socket发送数据,数据流通信使用

    sockfd:建立连接之后socket描述符

    buf:待发送的数据内存首地址

    len:要发送的字节数

    flags:一般写0阻塞发送即可

        MSG_DONTWAIT 不阻塞

        MSG_OOB      优先紧急数据

    返回值:成功发送的字节数,出错返回-1 //连接断开了就可能发送失败

接收数据

 ssize_t recv(int sockfd, void *buf, size_t len, int flags);功能:从建立连接的socket中接收数据,数据流通信使用

    sockfd:建立连接之后socket描述符

    buf:存储接收的数据的内存首地址

    len:buf的字节数

    flags:一般写0阻塞接收即可

        MSG_DONTWAIT 不阻塞

    返回值:成功接收到的字节数,-1出现错误,正常断开返回0

关闭socket

    close(fd)

    功能:关闭socket //一切皆文件 关闭新的那个socket 断开连接

   

    192.168.122.4   192.168.122.5   ip地址

    255.255.255.0   子网掩码

    192.168.122.0   网络地址

    192.168.122.4/24  (24个1)相当于&255.255.255.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA遇到 git pull 冲突的几种解决方法

1 忽略本地修改&#xff0c;强制拉取远程到本地 主要是项目中的文档目录&#xff0c;看的时候可能多了些标注&#xff0c;现在远程文档更新&#xff0c;本地的版本已无用&#xff0c;可以强拉 git fetch --all git reset --hard origin/dev git pull关于commit和pull的先后顺…

亚马逊鲲鹏系统是怎么操作测评的

亚马逊鲲鹏系统可以注册亚马逊买家号、养号、下单留评等&#xff0c;是一款功能比较齐全的测评软件&#xff0c;具体操作如下&#xff1a; 首先我们需要先准备好买家账号&#xff0c;账号可以直接去购买已经注册好了的账号&#xff0c;也可以准备好账号所需要的一些邮箱、ip、…

无门槛访问ChatGPT升级版-数据指北AI

大家好&#xff0c;我是脚丫先生 (o^^o) 给小伙伴们介绍ChatGPT升级版不需要任何门槛&#xff0c;不需要单独搞账号&#xff0c;只要邮箱登录的方式&#xff0c;即可访问平台&#xff0c;以用户体验为首要&#xff0c;让所有人都能无门槛的使用目前市面上最强大的AI智能聊天&a…

Rn实现省市区三级联动

省市区三级联动选择是个很频繁的需求&#xff0c;但是查看了市面上很多插件不是太老不维护就是不满足需求&#xff0c;就试着实现一个 这个功能无任何依赖插件 功能略简单&#xff0c;但能实现需求 核心代码也尽力控制在了60行左右 pca-code.json树型数据来源 Administrative-d…

液体神经网络LLN:通过动态信息流彻底改变人工智能

巴乌米克泰吉 一、说明 在在人工智能领域&#xff0c;神经网络已被证明是解决复杂问题的非常强大的工具。多年来&#xff0c;研究人员不断寻求创新方法来提高其性能并扩展其能力。其中一种方法是液体神经网络&#xff08;LNN&#xff09;的概念&#xff0c;这是一个利用动态计算…

07:STM32----ADC模数转化器

目录 1:简历 2:逐次逼近型ADC 3:ADC基本结构 4:输入通道 5:规则组的4种转换模式 1:单次转化,非扫描模式 2:连续转化,非扫描模式 3:单次转化,扫描模式 4:单次转化,扫描模式 6:触发控制 7:数据对齐 8:转化时间 9:校准 10:ADC的硬件电路 A: AD单通道 1:连接图 2:函…

Git小白入门——了解分布式版本管理和安装

Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统&#xff08;没有之一&#xff09; 什么是版本控制系统&#xff1f; 程序员开发过程中&#xff0c;对于每次开发对各种文件的修改、增加、删除&#xff0c;达到预期阶段的一个快照就叫做一个版本。 如果有一…

【OpenCV入门】第一部分——图像处理基础

本文结构 图像处理的基本操作读取图像imread() 显示图像imshow()waitKey()destroyAllWindows() 保存图像imwrite() 复制图像copy() 获取图像属性 像素确定像素的位置获取像素的BGR值修改像素的BGR值 色彩空间GRAY色彩空间cvtColor()——从BGR色彩空间转换到GRAY色彩空间 HSV色彩…

Lua学习(一)

lua基础学习 LUA 语言1. 什么是lua&#xff1f;1.1 准备工作 2. 基本语法2.1 注释2.2 标识符2.3 关键字2.4 全局变量 3. 数据类型4. 变量4.1 赋值语句 5. 循环5.1 while循环5.2 for循环5.3泛型for循环5.4 repeat until 循环5.5 break 语句 6. 流程控制6.1 if语句6.2 if else 语…

GNU make系列之介绍Makefile(0)

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

leetcode做题笔记96. 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 思路一&#xff1a;动态规划 int numTrees(int n){int f[n1];memset(f,0,sizeof(f));f[0] f[1] 1;for(int i 2;i<n;i)…

reactantd(12)动态表单的默认值问题

最近遇到一个需求是有一个表单可以输入各种信息&#xff0c;然后还需要有一个编辑功能&#xff0c;点击编辑的时候需要把当前数据填入到表单里面。在网上查了很多种方法&#xff0c;然后我的思路是使用initialValues搭配setState()使用。默认值都为空&#xff0c;然后点击单条数…

数学建模:ARMA时间序列预测

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 ARMA预测 时间序列是按时间顺序的一组数字序列 时间序列的特点&#xff1a; 现实的、真实的一组数据&#xff0c;时间序列背后是某一现象的变化规律&#xff0c;时间序列预测就是学习之前的规律来预测后面…

从零开始学习 Java:简单易懂的入门指南之查找算法及排序算法(二十)

查找算法及排序算法 常见的七种查找算法&#xff1a;1. 基本查找2. 二分查找3. 插值查找4. 斐波那契查找5. 分块查找6. 哈希查找7. 树表查找 四种排序算法&#xff1a;1. 冒泡排序1.1 算法步骤1.2 动图演示1.3 代码示例 2. 选择排序2.1 算法步骤2.2 动图演示 3. 插入排序3.1 算…

knife4j 整合 springboot

官方文档&#xff1a;https://doc.xiaominfo.com/knife4j 版本兼容说明&#xff1a;https://doc.xiaominfo.com/docs/quick-start/start-knife4j-version 升级说明&#xff1a;https://doc.xiaominfo.com/docs/upgrading/upgrading-to-v4版本兼容惯关系&#xff1a; springboot…

MySQL一行记录是如何存储的?

目录 MySQL的数据存放在哪个文件&#xff1f; 表空间文件的结构是怎么样的&#xff1f; 1、行&#xff08;row&#xff09; 2、页&#xff08;page&#xff09; 3、区&#xff08;extent&#xff09; 4、段&#xff08;segment&#xff09; InnoDB 行格式有哪些&#xf…

解读亚马逊云科技语义搜图检索方案

图像检索&#xff08;包括文搜图和图搜图&#xff09;是各个行业中常见的一个应用场景。比如在电商场景中&#xff0c;基于以图搜图做相似商品查找&#xff1b;在云相册场景中&#xff0c;基于文搜图来找寻所需的图像素材。 传统基于标签的图像检索方式&#xff0c;即先使用目标…

博流RISC-V芯片Eclipse环境搭建

文章目录 1、下载 Eclipse2、导入 bouffalo_sdk3、编译4、烧录5、使用ninja编译 之前编译是通过 VSCode 编译&#xff0c;通过手工输入 make 命令编译&#xff0c;我们也可以通过 Eclipse 可视化 IDE 来编译、烧录。 1、下载 Eclipse 至 Eclipse 官网 https://www.eclipse.org…

【Golang】go交叉编译

交叉编译是用来在一个平台上生成另一个平台的可执行程序 。Go 命令集是原生支持交叉编译的。 Mac下编译&#xff1a;Linux 或 Windows 的可执行程序 # linux 可执行程序 CGO_ENABLED0 GOOSlinux GOARCHamd64 go build main.go # Windows可执行程序 CGO_ENABLED0 GOOSwindow…

网络socket服务器开发几种并发模型详解

目录 一、socket创建流程。 二、I/O多路复用 三、服务器开发常见的并发模型 1、模型一:单线程——无IO复用 1.1 模型分析 2、模型二:单线程accept + 多线程读写业务(无IO复用) 模型分析 3、模型三:单线程多路IO复用 模型分析 4、模型四࿱