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

广播和组播(多播)

广播

概述

        广播(broadcast)是指封包在计算机网络中传输时,目的地址为网络中所有设备的一种传输方式。实际上,这里所说的“所有设备”也是限定在一个范围之中,称为“广播域”。并非所有的计算机网络都支持广播,例如 X.25 网络和帧中继都不支持广播,而且也没有在“整个互联网范围中”的广播。IPv6 亦不支持广播,广播相应的功能由多播代替。通常,广播都是限制在局域网中的,比如以太网或令牌环网络。因为广播在局域网中造成的影响远比在广域网中小得多。只有传输层协议是 UDP 时,才支持广播功能,因为 TCP 是端对端,广播是一对所有

广播地址

广播的 IP 地址是将 IP 地址中主机部分全部置为 1,即 xxx.xxx.xxx.255
局域网内发送广播:
例:
        IP:192.168.2.3
        netmask:255.255.255.0
        广播地址:192.168.2.255
        IP:192.168.2.3
        netmask:255.255.0.0
        广播地址:192.168.255.255
广播的优点:
        1.网络设备简单,维护简单,布网成本低廉 。
        2.由于服务器不用向每个客户机单独发送数据,所以服务器流量负载极低。
缺点:
        1.无法针对每个客户的要求和时间及时提供个性化服务。
        2.网络允许服务器提供数据的带宽有限,客户端的最大带宽=服务总带宽。例如有线电视的客户端的线路支持 100 个频道(如果采用数字压缩技术,理论上可以提供 500 个频道),即使服务商有更大的财力配置更多的发送设备、改成光纤主干,也无法超过此极限。也就是说无法向众多客户提供更多样化、更加个性化的服务。
        3.广播禁止在 Internet 宽带网上传输。
广播的编程步骤:
广播发送者:
        1.创建一个套接字(UDP)
        2.使能广播(开启套接字选项)
        3.使用 sendto 发送消息到广播地址(IP+端口号)
        4.也可以接收消息
        5.关闭套接字
广播接收者:
        1.创建一个套接字(UDP)
        2.使能广播(开启套接字选项)
        3.接收者从哪一个地址接收广播信息呢?绑定你要从哪一个地址接收广播信息(IP+ 端口)
        4.也可以使用 sendto 发送消息到广播地址(IP+端口)5.关闭套接字

        5.关闭套接字

程序实例

该实例程序一端负责向广播地址上发送消息,一端负责在广播地址上读取消息

消息发送端程序:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.使能广播int optval = 1; int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval));   //设置套接字的属性if(ret <= 0){perror("setsockopt error");}//可以绑定本地的 socket 的地址//直接发送消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));char buf[1024] = {"da jia dou shi liang zai!!!"};while(1){sleep(1);memset(buf,0,1024);fgets(buf,1024,stdin);ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr)); //发送广播if(ret <= 0){perror("sendto error");}printf("sendto size:%d\n",ret);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}

消息读取端程序:

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.使能广播int optval = 1; int ret = setsockopt(sockfd,SOL_SOCKET,SO_BROADCAST,(void*)&optval,sizeof(optval));//设置套接字的属性if(ret == -1){perror("setsockopt error");}//从指定的地址接收消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息的地址(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));//绑定一个 IP 地址ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr)); //可不绑定if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");char buf[1024] = {0};struct sockaddr_in send_addr; //用来保存消息发送方的地址while(1){memset(buf,0,1024);memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t len = sizeof(send_addr);ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收广播if(ret <= 0){perror("recv from error");}printf("recv size:%d\n",ret);printf("recv data:%s\n",buf);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}

组播(又称多播)

概述

        单播用于两个主机之间端对端的通信,例如我们的 TCP/UDP 消息通信,广播用于一个主机对整个局域网上所有主机的数据通信,单播和广播其实是两个极端,实际情况下,我们需要对网络上面一组特定的主机通信,这就是多播/组播,多播只有传输层协议为 UDP 的时候,才支持多播功 能,
        多播是指把信息同时传递给一组目的地址。它使用策略是最高效的,因为消息在每条网络链路上只需传递一次,而且只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点的传递被称作单播。当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可扩展性。不过,许多流行的协议,例如 XMPP 用限制接收者数量的方法弥补了这一不足。
多播地址
        多播的地址是特定的,D 类 IP 地址,即 1110-多播组号
                224.0.0.0 ~ 239.255.255.255 之间的 IP 都能用作多播组号
        把上面的 IP 地址划分为:
                局部多播地址 224.0.0.0~224.0.0.255
                预留多播地址 224.0.1.0~238.255.255.255
                管理权限多播地址 239.0.0.0~239.255.255.255
多播优点:
        1.需要相同数据流的客户端加入相同的组共享一条数据流,节省了服务器的负载。
        2.由于组播协议是根据接受者的需要对数据流进行复制转发,所以服务端的服务总带宽不受客户接入端带宽的限制。IP 协议允许有 2 亿 6 千多万个(268435456)组播,所以其提供的服务可以非常丰富。
        3.此协议和单播协议一样允许在 Internet 宽带网上传输。
多播缺点:
        1.与单播协议相比没有纠错机制,发生丢包错包后难以弥补,但可以通过一定的容错机制和 QOS 加以弥补。
        2.现行网络虽然都支持组播的传输,但在客户认证、QOS(指一个网络能够利用各种基础技 术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。)等方面还需要完善。
多播编程流程:
多播发送者(往多播地址发消息)
        (1).创建一个 UDP 套接字(socket)
        (2).可以绑定也可以不绑定(bind)
        (3).往多播组(多播地址 + 端口号)发送消息(sendto)
        (4).也可以接收消息(recvfrom)
        (5).关闭套接字(close)
多播接收者(从一个多播地址收消息)
        (1).创建一个 UDP 套接字
        (2).加入多播组(使用 setsockopt 函数设置)
        (3).绑定多播地址(从哪一个多播地址收消息)
        (4).接收多播组上面的消息(recvfrom)
        (5).也可以发送消息
        (6).关闭套接字

程序实例

该实例程序一端负责向多播地址上发送消息,一端负责在多播地址上读取消息
消息发送端程序:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//./main ip port
int main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//可以绑定本地的 socket 的地址//直接发送消息(定义一个接收消息的地址)struct sockaddr_in addr; //保存接收消息端地址信息(IP+port)memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));char buf[1024] = {0};while(1){memset(buf,0,1024);fgets(buf,1024,stdin);int ret = sendto(sockfd,buf,strlen(buf),0,(struct sockaddr*)&addr,sizeof(addr));       //发送消息if(ret <= 0){perror("sendto error");}printf("sendto size:%d\n",ret);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
消息接收端程序:
#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include<netinet/in.h> //为了使用 IPV4 地址结构体
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>//struct ip_mreq {
// struct in_addr imr_multiaddr; /* IP multicast group address */
// struct in_addr imr_address; /* IP address of local interface */
//};//./main MultiIP Portint main(int argc,char *argv[])
{if(argc != 3){printf("please input ip + port!\n");return 0;}//1.创建一个 UDP 套接字int sockfd = socket(AF_INET, SOCK_DGRAM,0); //创建一个 IPV4 的数据包套接字if(-1 == sockfd){perror("create socket failed");exit(-1);}//2.加入指定的多播组//描述你要加入的多播组struct ip_mreq mreq;memset(&mreq,0,sizeof(mreq));mreq.imr_multiaddr.s_addr = inet_addr(argv[1]); //多播地址//mreq.imr_interface = inet_addr(argv[2]); //本地网址mreq.imr_interface.s_addr = htonl(INADDR_ANY); //让内核自动选择一个网卡int ret = setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(void*)&mreq,sizeof(mreq));     //设置套接字属性if(ret == -1){perror("setsockopt error");}//3.绑定多播地址//从指定的多播地址接收消息(定义一个接收消息的地址)struct sockaddr_in addr; memset(&addr,0,sizeof(struct sockaddr_in)); //清空结构体addr.sin_family = AF_INET;inet_aton(argv[1], &addr.sin_addr);addr.sin_port = htons(atoi(argv[2]));//绑定一个 IP 地址ret = bind(sockfd,(struct sockaddr *)&addr,sizeof(addr));if(ret == -1){perror("bind error");exit(-1);}printf("bind success\n");char buf[1024] = {0};struct sockaddr_in send_addr; //用来保存消息发送方的地址while(1){memset(buf,0,1024);memset(&send_addr,0,sizeof(struct sockaddr_in)); //清空结构体socklen_t len = sizeof(send_addr);ret = recvfrom(sockfd,buf,1024,0,(struct sockaddr*)&send_addr,&len); //接收消息if(ret <= 0){perror("recv from error");}printf("sendIP:%s,sendPort:%d\n",inet_ntoa(send_addr.sin_addr),ntohs(send_addr.sin_port));printf("recv data:%s\n",buf);}//关闭套接字shutdown(sockfd,SHUT_RDWR);close(sockfd);return 0;
}
在上面例子中接收多播消息要使用 setsockopt 函数将套接字加入多播组,使用 ip_mreq 结构体设置,其中 ip_mreq 结构体如下:
struct ip_mreq
{struct in_addr imr_multiaddr; /* IP multicast group address */
//多播组的 IP 地址(你要接收哪一个组上的信息)struct in_addr imr_address; /* IP address of local interface */
//本地的 IP 地址,多播组的数据包收发通过本地的哪一个网卡
};

相关文章:

广播和组播(多播)

广播 概述 广播&#xff08;broadcast&#xff09;是指封包在计算机网络中传输时&#xff0c;目的地址为网络中所有设备的一种传输方式。实际上&#xff0c;这里所说的“所有设备”也是限定在一个范围之中&#xff0c;称为“广播域”。并非所有的计算机网络都支持广播&#xf…...

【Linux】gdb调试

目录 进入调试查看代码运行代码断点打断点查断点删断点从一个断点转跳至下一个断点保留断点但不会运行该断点 退出调试逐过程逐语句监视跳转至指定行运行结束当前函数 进入调试 指令&#xff1a;gdb 【可执行文件】&#xff1a; 查看代码 &#xff1a;l 【第几行】如果输入指…...

MySQL创建函数及其使用

MySQL创建函数及其使用 一、MySQL 创建函数二、示例 一、MySQL 创建函数 MySQL 函数是一种可重用的代码块&#xff0c;可以接受输入参数并返回值。你可以在 MySQL 中创建各种类型的函数&#xff0c;包括系统函数、用户定义函数和存储过程。在此处&#xff0c;我们将重点关注用…...

大数据-Storm流式框架(四)---storm容错机制

1、集群节点宕机 Nimbus服务器 硬件 单点故障&#xff1f;可以搭建HA jStorm搭建 nimbus的HA nimbus的信息存储到zookeeper中&#xff0c;只要下游没问题&#xff08;进程退出&#xff09;nimbus退出就不会有问题&#xff0c; 如果在nimbus宕机&#xff0c;也不能提交…...

SpringBoot项目把Mysql从5.7升级到8.0

首先你需要把之前的库导入到mysql库导入到8.0的新库中。&#xff08;导入的时候会报错我是通过navcat备份恢复的&#xff09; 1、项目中需要修改pom文件的依赖 mysql 和 jdbc <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java&…...

RK3568-适配at24c04模块

将at24c04模块连接到开发板i2c2总线上 i2ctool查看i2c2总线上都有哪些设备 UU表示设备地址的从设备被驱动占用,卸载对应的驱动后,UU就会变成从设备地址。at24c04模块设备地址 0x50和0x51是at24c04模块i2c芯片的设备地址。这个从芯片手册上也可以得知。A0 A1 A2表示的是模块对…...

Banana Pi BPI-W3 ArmSoM-W3之RK3588-MIPI-DSI屏幕调试笔记

一. 简介 本文是基于RK3588平台&#xff0c;MIPI屏调试总结。 二. 环境介绍 硬件环境&#xff1a; ArmSoM-W3 RK3588开发板、MIPI-DSI显示屏( ArmSoM官方配件 )软件版本&#xff1a; OS&#xff1a;ArmSoM-W3 Debian11 三. MIPI屏幕调试 3.1 调试总览&#xff0c;调试步骤分…...

Git的远程仓库

Git的远程仓库 添加远程仓库从远程库克隆 添加远程仓库 你在本地创建了一个Git仓库后&#xff0c;又想在GitHub创建一个Git仓库&#xff0c;并且让这两个仓库进行远程同步&#xff0c;这样&#xff0c;GitHub上的仓库既可以作为备份&#xff0c;又可以让其他人通过该仓库来协作…...

Linux虚拟网络设备—Veth Pair

veth是Virtual Ethernet Device的缩写&#xff0c;是一种成对出现的Linux虚拟网络接口设备。它最常用的功能是用于将不同的Linux network namespaces 命名空间网络连接起来&#xff0c;让二个namespaces之间可以进行通信。我们可以简单的把veth pair理解为用一根网线&#xff0…...

Parcelable protocol requires the CREATOR object to be static on class com.test

对于 Parcelable 协议&#xff0c;确实要求 CREATOR 对象必须是静态的。这是因为在反序列化过程中&#xff0c;需要通过 CREATOR 对象来创建 Parcelable 对象的实例。 根据错误信息&#xff0c;涉及到了com.test类中的问题。通常情况下&#xff0c;如果一个内部类需要实现 Par…...

Python的Matplotlib库:数据可视化的利器

引言&#xff1a; Matplotlib是一款强大的Python库&#xff0c;专为数据可视化而设计。无论是绘制折线图、散点图、柱状图还是饼图&#xff0c;Matplotlib都能提供灵活且易于操作的绘图方法。 1. Matplotlib简介 Matplotlib是Python中最流行的绘图库之一&#xff0c;被广泛应…...

普通人做抖店,需要具备什么条件?一篇详解!

我是电商珠珠 抖音小店的热度一直很高&#xff0c;对于想开店的新手来说&#xff0c;不知道需要什么条件&#xff0c;今天我就来给大家详细的讲一下。 一、营业执照 在入驻抖音小店之前&#xff0c;需要准备一张营业执照。 营业执照一共有两种类型&#xff0c;一种为个体工…...

Django分页功能的使用和自定义分装

1. 在settings中进行注册 # drf配置 REST_FRAMEWORK {DEFAULT_AUTHENTICATION_CLASSES: (# rest_framework_jwt.authentication.JSONWebTokenAuthentication,rest_framework_simplejwt.authentication.JWTAuthentication,rest_framework.authentication.SessionAuthenticatio…...

React-hooks有哪些用法?

React Hooks 是 React 16.8 引入的一种新的特性,用于在函数组件中使用状态和其他 React 特性。下面列举了一些常见的 React Hooks 的用法: 1:useState:用于在函数组件中添加状态。: import React, { useState } from react;function MyComponent() {const [count, setCou…...

2024年CFA一级公示表,一级quicksheet(内附分享链接)

随着金融行业的迅速发展&#xff0c;CFA&#xff08;特许金融分析师&#xff09;认证成为了许多金融从业者追求的目标。2024年CFA一级公示表资料的自学&#xff0c;为那些渴望在金融领域取得突破的人们提供了宝贵的机会。 通过自学CFA一级公示表资料&#xff0c;我们可以深入了…...

【Kubernetes】 Kubernetes 了解云原生的原理

Kubernetes 了解云原生的原理 云原生是一种软件设计、实施和部署方法&#xff0c;旨在充分利用基于云的服务和交付模型。云原生[1]应用程序通常也使用分布式架构运行。这意味着应用程序功能被分解为多个服务&#xff0c;然后分布在托管环境中&#xff0c;而不是整合到单个服务…...

什么是jquery

jquery是一个javascript库&#xff1b;用来简化javascript编程&#xff1b;基本是前端必备&#xff1b; 看一下示例&#xff1b; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <script src"https://cdn.staticfile.org/j…...

竞赛选题 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…...

新华三路由器+华为交换机,实现华为交换机指定端口访问外网

需求背景&#xff1a; 多台服务器使用华为交换机组建了局域网&#xff0c;需要让交换机的指定端口可以访问外网。 需求分析&#xff1a; 交换机组建的局域网是二层组网&#xff0c;需借助路由器接入外网&#xff0c;然后通过DHCP分配内网IP地址给交换机指定端口连接的设备。 …...

Java面试(JVM篇)——JVM 面试题合集 深入理解JVM虚拟机

关于什么是JVM&#xff1f; 作用&#xff1a; 运⾏并管理Java 源码⽂件所⽣成的Class⽂件&#xff0c;在不同的操作系统上安装不同的JVM &#xff0c;从⽽实现了跨平台的保证。 ⼀般情况下&#xff0c;对于开发者⽽⾔&#xff0c;即使不熟悉JVM 的运⾏机制并不影响业务代码的…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

深入浅出Diffusion模型:从原理到实践的全方位教程

I. 引言&#xff1a;生成式AI的黎明 – Diffusion模型是什么&#xff1f; 近年来&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;领域取得了爆炸性的进展&#xff0c;模型能够根据简单的文本提示创作出逼真的图像、连贯的文本&#xff0c;乃至更多令人惊叹的…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日&#xff0c;在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上&#xff0c;可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞&#xff0c;强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...