【网络socket】基于poll和epoll通信温度上报
网络socket通信
- poll函数
- epoll函数
- poll代码实现
- epoll代码实现
poll函数
poll是Linux中的字符设备驱动中的一个函数,poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态,如果设备就绪则在设备等待队列中加入一项并继续遍历,如果遍历完所有fd后没有发现就绪设备,则挂起当前进程,直到设备就绪或者主动超时,被唤醒后它又要再次遍历fd。这个过程经历了多次无谓的遍历。
int poll(struct pollfd *fds, nfds_t nfds, int timeout);参数:
pollfd:指向一个struct pollfd类型的数组,每一个pollfd结构体指定了一个被监视的文件描述符,指示poll()监视多个文件描述符。每个结构体的events域是监视该文件描述符的事件掩码,由用户来设置这个域。revents域是文件描述符的操作结果事件掩码,内核在调用返回时设置这个域,events域中请求的任何事件都可能在revents域中返回。nfds 指定数组中监听的元素个数.timeout指定等待的毫秒数,无论I/O是否准备好,poll都会返回。timeout指定为负数值表示无限超时,使poll()
一直挂起直到一个指定事件发生;timeout为0指示poll调用立即返回并列出准备好I/O的文件描述符,但并不等待其它的事件。
struct pollfd
{int fd; /* 文件描述符 */short events; /* 等待的事件 */short revents; /* 实际发生了的事件 */
} ;
下表列出指定 events 标志以 及测试 revents 标志的一些常值:
timeout:该函数成功调用时,poll()返回结构体中revents域不为0的文件描述符个数;如果在超时前没有任何事件发生,poll()返回0; 失败时,poll()返回-1,并设置errno为下列值之一:
EBADF 一个或多个结构体中指定的文件描述符无效。
EFAULTfds 指针指向的地址超出进程的地址空间。
EINTR 请求的事件之前产生一个信号,调用可以重新起。
EINVALnfds 参数超出PLIMIT_NOFILE值。
ENOMEM 可用内存不足,无法完成请求。
epoll函数
epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:
水平触发LT模式:
- 水平触发的主要特点是,如果用户在监听epoll事件,当内核有事件的时候,会拷贝
给用户态事件,但是如果用户只处理了一次,那么剩下没有处理的会在下一次
epoll_wait再次返回该事件。
这样如果用户永远不处理这个事件,就导致每次都会有该事件从内核到用户的拷
贝,耗费性能,但是水平触发相对安全,最起码事件不会丢掉,除非用户处理完
毕
边沿触发ET模式:
- 边缘触发,相对跟水平触发相反,当内核有事件到达, 只会通知用户一次,至于用
户处理还是不处理,以后将不会再通知。这样减少了拷贝过程,增加了性能,但是
相对来说,如果用户马虎忘记处理,将会产生事件丢的情况。
边沿触发仅触发一次,水平触发会一直触发。
int epoll_create(int size);
功能:
创建epoll
参数:size忽略不用
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *ev);
功能:修改epoll的增删改查
参数:epfd是epoll_create返回值op是用来指定需要执行的操作fd:指明了要修改兴趣列表中的哪一个文件描述符的设定。该参数可以是代表管道、FIFO、套接字、POSIX消息队列、inotify实例、终端、设备,甚至是另一个epoll实例的文件描述符ev:的指针结构体
op指定操作的值:添加,删除,修改对fd的监听
EPOLL_CTL_ADD | 添加fd到epoll |
---|---|
EPOLL_CTL_MOD | 修改已经注册fd的事件 |
EPOLL_CTL_DE | epfd删除一个fd |
结构体epoll_event的指针,结构体的定义如下:
typedef union epoll_data
{void *ptr; //指向用户定义数据的指针int fd; //文件描述符uint32_t u32; //32位整数 uint64_t u64; //64位整数
} epoll_data_t;struct epoll_event
{uint32_t events; //设置什么属性epoll_data_t data; //用户数据
};
int epoll_wait(int epfd, struct epoll_event *evlist, int maxevents, int timeout);
功能:
等待就绪事件
参数:epfd是epoll_create()的返回值evlist所指向的结构体数组中返回的是有关就绪态文件描述符的信息,数组evlist的空间由调用者负责申请;maxevents指定所evlist数组里包含的元素个数;timeout用来确定epoll_wait()的阻塞行为,有如下几种:如果timeout等于-1,调用将一直阻塞,直到兴趣列表中的文件描述符上有事件产生或者直到捕获到一个信号为止。如果timeout等于0,执行一次非阻塞式地检查,看兴趣列表中的描述符上产生了哪个事件。如果timeout大于0,调用将阻塞至多timeout毫秒,直到文件描述符上有事件发生,或者直到捕获到一个信号为止
events中的值如下所示:
常量 | 说明 | 作为 epoll_ctl()的输入 | 作为epoll_wait()的返回 |
---|---|---|---|
EPOLLIN | 可读取非高优先级数据 | 能 | 能 |
EPOLLPRI | 可读取高优先级数据 | 能 | 能 |
EPOLLRDHUP | socket对端关闭 | 能 | 能 |
EPOLLOUT | 普通数据可写 | 能 | 能 |
EPOLLET | 采用边沿触发事件通知 | 能 | |
EPOLLONESHOT | 在完成事件通知之后禁用检查 | 能 | |
EPOLLERR | 有错误发生 | 能 | |
POLLHUP | 出现挂断 | 能 |
epoll的优点
- 支持一个进程打开大数目的socket描述符(fd)
- IO效率不随fd数目增加而线性下降
- 使用mmap加速内核与用户空间的消息传递
- 内核微调
poll代码实现
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <getopt.h>
#include <stdlib.h>
#include <sys/select.h>
#include <ctype.h>
#include <libgen.h>
#include <poll.h>#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))//求数组元素的个数int socket_Server_init(char *listen_ip,int listen_port);
void sqlite_tem(char *buf);void print_usage(char *progname)
{printf("%s usage: \n", progname);printf("-p(--port): sepcify server listen port.\n");printf("-h(--Help): print this help information.\n");printf("-d(--daemon):set program running on background\n");return ;
}int main (int argc, char **argv)
{int listenfd = -1;int clifd;struct sockaddr_in servaddr;struct sockaddr_in cliaddr;socklen_t len;int serv_port = 0;int ch;int rv ;int on = 1;char buf[1024];int i,j;int found;int max;int daemon_run = 0;char *progname = NULL;struct pollfd fds_arry[1024];struct option opts[] =
{{"daemon",no_argument,NULL,'b'},{"port", required_argument, NULL, 'p'},{"help", no_argument, NULL, 'h'},{NULL, 0, NULL, 0}
};
progname = basename(argv[0]);while( (ch=getopt_long(argc, argv, "bp:h", opts, NULL)) != -1 ){switch(ch){case 'p':serv_port=atoi(optarg);break;case 'b':daemon_run=1;break;case 'h':print_usage(argv[0]);return 0;}}if( !serv_port ){print_usage(argv[0]);return 0;}if( (listenfd = socket_Server_init(NULL, serv_port)) <0){printf("ERROR %s server listen on port %d failure\n",argv[0],serv_port);return -1;}printf("%s server start to listen on port %d\n",argv[0],serv_port);if(daemon_run)//设置进程后台运行{daemon(0,0);}for(i=0; i<ARRAY_SIZE(fds_arry); i++)//遍历数组{fds_arry[i].fd=-1;//将整个数组初始化为-1,为什么是-1;因为这个数组存放的是文件描述符,系统会生成三个文件描述符0,1,2} fds_arry[0].fd = listenfd;//将第一个数组赋值为listenfd//一个tcp的网络链接中包含一个四元组:源ip,目的ip,源端口,目的端口fds_arry[0].events = POLLIN;max = 0;for( ; ; ){rv = poll(fds_arry, max+1, -1);if(rv < 0){printf("POLL failure:%s\n",strerror(errno));break;}else if( rv ==0 ){printf("poll get timeout\n");continue;}if( fds_arry[0].revents & POLLIN )//判断指定描述符是否在集合中{if( (clifd=accept(listenfd,(struct sockaddr *)NULL,NULL)) < 0){printf("accept new client failure:%s\n",strerror(errno));continue;}found = 0;for(i=0; i<ARRAY_SIZE(fds_arry);i++){if( fds_arry[i].fd< 0 ){printf("accept new client [%d] and add it into array\n",clifd);fds_arry[i].fd = clifd;fds_arry[i].events = POLLIN;found = 1;break;}}if(!found){printf("accept new client [%d] but full, so refuse it\n",clifd);close(clifd);continue;}max = i>max ? i:max;if( rv <=0 )continue;}else{for ( i=1; i<ARRAY_SIZE(fds_arry);i++){if(fds_arry[i].fd < 0)continue;if( (rv=read(fds_arry[i].fd,buf,sizeof(buf))) <=0){printf("socket [%d] read failure or get disconnected\n",fds_arry[i].fd);close(fds_arry[i].fd);fds_arry[i].fd=-1;}else{printf("%s\n",buf);sqlite_tem(buf);printf("Database inserted successfully!\n"); }}}
}
cleanup:close(listenfd);return 0;
}int socket_Server_init(char *listen_ip, int listen_port)
{struct sockaddr_in servaddr;int rv = 0;int on = 1;int listenfd;if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){printf("use socket()to create a TCP socket failure:%s\n",strerror(errno));return -1;}setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));memset(&servaddr,0,sizeof(servaddr));servaddr.sin_family=AF_INET;servaddr.sin_port = htons(listen_port);if( !listen_ip ){servaddr.sin_addr.s_addr = htonl(INADDR_ANY);}else{if(inet_pton(AF_INET, listen_ip, &servaddr.sin_addr) <=0){printf("inet_pton set listen IP address failure\n");rv = -2;goto cleanup;}}if( bind(listenfd,(struct sockaddr *)&servaddr,sizeof(servaddr)) < 0){printf("socket[%d] bind to port failure:%s\n",listenfd,strerror(errno));rv = -3;goto cleanup;}if( listen(listenfd,13) < 0){printf("use bind to bind tcp socket failure:%s\n",strerror(errno));rv = -4;goto cleanup;}cleanup:if(rv < 0)close(listenfd);elserv = listenfd;return rv;
}void sqlite_tem(char *buf)
{ int nrow=0;int ncolumn = 0;char **azResult=NULL;int rv; sqlite3 *db=NULL;char *zErrMsg = 0;char sql1[100];char *ipaddr=NULL;char *datetime=NULL;char *temper=NULL;char *sql = "create table if not exists temperature(ipaddr char(30), datetime char(50), temper char(30))"; ipaddr = strtok(buf,"/");datetime = strtok(NULL, "/");temper = strtok(NULL, "/");rv = sqlite3_open("tempreture.db", &db);if(rv){printf("Can't open database:%s\n", sqlite3_errmsg(db));sqlite3_close(db);return;}printf("opened a sqlite3 database named tempreture.db successfully!\n");int ret = sqlite3_exec(db,sql, NULL, NULL, &zErrMsg);if(ret != SQLITE_OK){printf("create table fail: %s\n",zErrMsg);}if(snprintf(sql1,sizeof(sql1), "insert into temper values('%s','%s','%s')", ipaddr, datetime, temper) < 0){printf("Failed to write data\n");}//printf("Write data successfully!\n");sqlite3_exec(db, sql1, 0, 0, &zErrMsg);sqlite3_free(zErrMsg);sqlite3_close(db);return;
}
epoll代码实现
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <getopt.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/epoll.h>#include "sqlite3.h"#define BACKLOG 13
#define MAX_EVENTS 512void print_usage(char* progname);
void sig_stop(int signum);
void sqlite_tem(char *buf);
int socket_listen(char *listen_ip, int port);static int g_stop = 0;int main(int argc, char* argv[])
{int rv;int ret;int opt;int idx;int port;int log_fd;int ch = 1;int daemon_run = 0;int ser_fd = -1;int cli_fd = -1;struct sockaddr_in cli_addr;socklen_t cliaddr_len = 20;int epollfd;struct epoll_event event;struct epoll_event event_array[MAX_EVENTS];int events;int found;int a;int i;char *zErrMsg;sqlite3 *db;char buf[1024];struct option opts[] = {{"daemon", no_argument, NULL, 'd'},{"port", required_argument, NULL, 'p'},{"help", no_argument, NULL, 'h'},{NULL, 0, NULL, 0}};while ((opt = getopt_long(argc, argv, "dp:h", opts, &idx)) != -1){switch (opt){case 'd':daemon_run = 1;break;case 'p':port = atoi(optarg); break;case 'h':print_usage(argv[0]); return 0;}}if (!port){print_usage(argv[0]);return 0;}/*创建日志*/if (daemon_run){printf("Program %s is running at the background now\n", argv[0]);log_fd = open("receive_temper.log", O_CREAT | O_RDWR, 0666);if (log_fd < 0){printf("Open the logfile failure : %s\n", strerror(errno));return 0;}dup2(log_fd, STDOUT_FILENO);dup2(log_fd, STDERR_FILENO);if ((daemon(1, 1)) < 0){printf("Deamon failure : %s\n", strerror(errno));return 0;}}/*安装信号*/signal(SIGUSR1, sig_stop);/*调用socket*/if( (ser_fd = socket_listen(NULL, port)) < 0 ){printf("ERROR: %s server listen on serv_port %d failure\n", argv[0], port);return -2;}printf("server start to listen on serv_port %d\n", port);/*创建opll*/if ((epollfd = epoll_create(MAX_EVENTS)) < 0){printf("epoll_create failure:%s\n", strerror(errno));return 0;}event.events = EPOLLIN;event.data.fd = ser_fd;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, ser_fd, &event) < 0){printf("epoll add ser_fd failure:%s\n", strerror(errno));return 0;}while (!g_stop){events = epoll_wait(epollfd, event_array, MAX_EVENTS, -1);if (events < 0){printf("epoll failure:%s\n", strerror(errno));break;}else if (events == 0){printf("epoll get timeout\n");continue;}for (i = 0;i < events;i++){if ((event_array[i].events & EPOLLERR) || (event_array[i].events & EPOLLHUP)){printf("epoll_wait get error on fd[%d]:%s\n", event_array[i].data.fd, strerror(errno));epoll_ctl(epollfd, EPOLL_CTL_DEL, event_array[i].data.fd, NULL);close(event_array[i].data.fd);}if (event_array[i].data.fd == ser_fd){cli_fd = accept(ser_fd, (struct sockaddr*) & cli_addr, &cliaddr_len);if (cli_fd < 0){printf("Accept the request from client failure:%s\n", strerror(errno));continue;}event.data.fd = cli_fd;event.events = EPOLLIN;if (epoll_ctl(epollfd, EPOLL_CTL_ADD, cli_fd, &event) < 0){printf("epoll add client socket failure:%s\n", strerror(errno));close(cli_fd);continue;}}else{memset(buf, 0, sizeof(buf));a = read(cli_fd, buf, sizeof(buf)); if (a < 0) {printf("Read information from client failure:%s\n", strerror(errno));close(cli_fd);exit(0);}else if (a == 0) {printf("The connection with client has broken!\n");close(cli_fd);exit(0);}else {printf("%s\n",buf);sqlite_tem(buf);printf("Database inserted successfully!\n"); }}}}close(ser_fd);return 0;
}/*帮助信息*/
void print_usage(char* progname)
{printf("-d(--daemon):let program run in the background.\n");printf("-p(--port):enter server port.\n");printf("-h(--help):print this help information.\n");return;
}/*信号函数*/
void sig_stop(int signum)
{if (SIGUSR1 == signum) {g_stop = 1; }return;
}/*socket函数*/
int socket_listen(char *listen_ip, int port)
{int rv = 0;int on = 1;int ser_fd;struct sockaddr_in servaddr;if ( (ser_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){ printf("Use socket() to create a TCP socket failure: %s\n", strerror(errno));return -1; } setsockopt(ser_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));memset(&servaddr, 0, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(port);if( !listen_ip ){ servaddr.sin_addr.s_addr = htonl(INADDR_ANY);} else{ if( inet_pton(AF_INET, listen_ip, &servaddr.sin_addr) <= 0 ){ printf("Inet_pton() set listen IP address failure\n");rv = -2; goto cleanup;} }if( bind(ser_fd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 ){ printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));rv = -3; goto cleanup;}if( listen(ser_fd, 64) < 0 ){ printf("Use bind() to bind the TCP socket failure: %s\n", strerror(errno));rv = -4; goto cleanup;} cleanup:if( rv < 0 )close(ser_fd);elserv = ser_fd;return rv;
}/*数据库*/
void sqlite_tem(char *buf)
{ int nrow=0;int ncolumn = 0;char **azResult=NULL;int rv; sqlite3 *db=NULL;char *zErrMsg = 0;char sql1[100];char *ipaddr=NULL;char *datetime=NULL;char *temper=NULL;char *sql = "create table if not exists temperature(ipaddr char(30), datetime char(50), temper char(30))"; ipaddr = strtok(buf,"/");datetime = strtok(NULL, "/");temper = strtok(NULL, "/");rv = sqlite3_open("tempreture.db", &db);if(rv){printf("Can't open database:%s\n", sqlite3_errmsg(db));sqlite3_close(db);return;}printf("opened a sqlite3 database named tempreture.db successfully!\n");int ret = sqlite3_exec(db,sql, NULL, NULL, &zErrMsg);if(ret != SQLITE_OK){printf("create table fail: %s\n",zErrMsg);}if(snprintf(sql1,sizeof(sql1), "insert into temper values('%s','%s','%s')", ipaddr, datetime, temper) < 0){printf("Failed to write data\n");}//printf("Write data successfully!\n");sqlite3_exec(db, sql1, 0, 0, &zErrMsg);sqlite3_free(zErrMsg);sqlite3_close(db);return;
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- gRPC从原理到实践【上】
以下摘自官方 一句话定义 一个高性能,开源的通用RPC框架。基于HTTP/2协议设计。 特点 1、gRPC 是一个现代开源的高性能远程过程调用 (RPC) 框架,可以在任何环境中运行。 2、可以通过对负载平衡、跟踪、健康检查和身份验证的可插拔支持有效地连接数据…...
2024/4/19 15:55:12 - Cookie、Session、Token、JWT 之间的区别
一、前言 认证(Authentication) 通俗地讲就是验证当前用户的身份 互联网中的认证: - 用户名密码登录 - 邮箱发送登录链接 - 手机号接收验证码 - 只要你能收到邮箱/验证码,就默认你是账号的主人授权(Authorization&am…...
2024/4/5 4:39:38 - 《大事件项目》之基于AjaxLayuigit开发的简易注册登录页面
1. 首先我们要先准备好我们的项目文件夹 login® 文件夹里准备好一个文件夹(assets) 里面准备好css、fonts、images、js、lib文件夹,存放好需要用到的配置文件 以及login.html页面 接下来就是使用Git管理仓库了,然后接下…...
2024/4/14 9:57:57 - Git和GitHub学习笔记
Git和GitHub学习笔记1. Git概述1.1 版本控制1.2 版本控制工具1.3 Git发展历史1.3 Git工作机制1.4 Git和代码托管中心1.4.1 局域网1.4.2 互联网2. Git安装3. Git常用命令3.1 设置用户签名3.2 初始化本地化库3.3 查看本地库状态3.4 新增文件3.5 添加到暂存区3.6 提交本地库3.7 版…...
2024/4/14 9:57:57 - 大事件笔记
这里我们使用到的是 layui ,先登录找到 layui 的官方文档: Layui - 经典开源模块化前端 UI 框架 使用流程: 左侧是快捷导航,能够让我们快速找到对应的一些页面效果分类或者是功能分类 左侧选中我们想要的分类之后,右侧会有一个子分类&…...
2024/4/14 9:58:12 - GPU Gems 2 三:几何实例化的原理 四:分段缓冲 五:多流管理 六:遮挡查询
3.1 实例化是什么?为什么要实例化? 实例化就是生成一个个体,比如一棵树,一簇草丛,实例化的目的是为了节省性能,因为每一棵树我们不能调用一次绘制API,我们需要把尽可能多的东西,合批…...
2024/4/14 9:58:17 - 毕业6年,技术人的不惑之路,2021Android高级面试题及答案
本人二本(国内排名500名开外)毕业6年,从毕业到现在换过三次工作(低于一个月的不算),期间待过小公司、B轮创业公司、中型传统互联网公司,当前就职于BAT某公司的全资子公司,来当前公司…...
2024/4/14 9:57:52 - VS2022编写C语言及背景美化
文章目录前言一、VS2022编写C语言基本步骤二、VS2022背景美化1.安装插件2.插件的使用总结前言 上一篇文章介绍了什么是C语言及使用VS2013编写C语言的基本步骤,现在再来介绍一些最新的VS编译器VS2022编写C语言的基本步骤 一、VS2022编写C语言基本步骤 基本步骤 起始…...
2024/4/16 4:44:11 - windows和Linux下nacos单机安装配置启动方法及注意要点
目录nacos单节点安装1 Windows下安装1.1 下载安装包1.2 解压1.3端口配置1.4启动2 LINUX下nacos安装2.1安装jdk2.2 解压2.3 端口配置2.4启动今天打算分享一下微服务注册配置中心alibaba-nacos的单节点安装配置与集群安装配置方法。首先我们来看单节点安装配置的方法。nacos单节点…...
2024/4/20 7:08:57 - 1.1蓝桥杯单片机学习之环境搭建
1.1蓝桥杯单片机学习之环境搭建 Keil C51的安装 首先双击打开keil C51的exe安装程序 在接下来的弹出的窗口中一直点击NEXT 在这里在每个框里面随便填一些内容就可以进行下一步了,这些内容不会影响到后面 然后就是安装完成了。 STC烧录软件设置 首先直接打开…...
2024/4/29 12:57:20 - 征文投稿丨使用轻量应用服务器部署Hadoop云集群
编者按:本文来自轻量应用服务器征文活动用户投稿,已获得作者(昵称Maynor大数据)授权发布。 由于我在工作学习中经常需要使用到Hadoop集群,而本地Hadoop有启动速度慢、操作麻烦和占用内存等痛点。最近在和粉丝的交流中&…...
2024/4/7 15:30:55 - 软件测试技能,JMeter压力测试教程,设置集合点(十七)
目录:导读一、前言二、同步定时器 Synchronizing Timer三、并发请求四、超时时间一、前言 LoadRunner 中可以设置一个集合点,设置多个虚拟用户等待到一个时间点,到齐后一起发请求达到并发的目的 jmeter 中使用 同步定时器 Synchronizing Ti…...
2024/4/19 1:24:19 - Kubernetes(k8s)安装部署配置
aliyun 的Severless Kubernet,无需配置,直接使用。但是还是要自己先熟悉一下过程吧。 接下来把笔记写一下。 一、用VirtualBox准备三台CentOS7 本机环境是ubuntu,作为Master,再用VirtualBox 准备两台CentOS7,作为worker。 部署过程参考我的上…...
2024/4/20 11:53:21 - knn两个
先考虑训练集很大,测试集很小的情况 将测试集设置为全局文件,由于测试集很小,所以用hdfs的方法,在每一个map节点都会计算出它与每一个测试集的距离,输出:Key测试集ID,Value标签,距离…...
2024/4/25 11:18:25 - php定义空对象
没啥用,但是偶尔用,下面三种是定义空对象的方法 $obj1 new \stdClass; $obj2 new class{}; $obj3 (object)[];...
2024/4/18 2:50:03 - Python最快爬取网络图片并保存的方法
Python最快爬取网络图片并保存的方法 直接上代码了,小白都可以看的懂,大神的话就绕行吧,或者留下批评指正 # 导入模块 import requests# 下载图片地址 url = "" # 填上要爬取的图片地址# 发送请求获取响应 response = requests.get(url)# 保存图片 with open(imag…...
2024/4/7 15:30:50 - jenkins上因为vue版本编译错误
vue版本升级后,jenkins上出现编译错误后,把package-lock.json提交上去就没问题了。之前它编译时执行npm install也会出现package-lock.json,但是文件里面的版本不对。把本地正确版本的package-lock.json提交后就没问题了...
2024/4/14 9:58:58 - 分布式部署LNMP+WordPress
一.MYSQL主从配置 1. 基础环境安装 (1)修改主机名 使用远程连接工具CRT连接到192.168.200.30、192.168.200.40这两台虚拟机,并对这两台虚拟机进行修改主机名的操作,192.168.200.30主机名修改为mysql1,192.168.200.4…...
2024/4/14 9:58:33 - D5:Grocery Problem(杂货问题,附题解)
原题:OpenJudge - 05:Grocery Problem 翻译: 描述:寻找4种价格的物品,要求是4个物品的价格和为711且价格积为711000000。已知所有物品的价格是递增的; 输入:无; 输出:一行&#…...
2024/4/19 6:16:23 - ISP、IAP、ICP烧写方式的区别
玩单片机的都应该听说过ISP、IAP和ICP这几个词。一直搞不太清楚他们之间的区别。今天查了资料后总结整理如下。 ISP:In System Programing 在系统编程 IAP:In applicating Programing 在应用编程 ICP:In Circuit Programing …...
2024/4/14 9:58:53
最新文章
- vue3+ts 原生 js drag drop 实现
vue3ts 原生 js drag drop 实现 一直以来没有涉及的一个领域就是 drag drop 拖动操作,研究了下,实现了,所以写个教程。 官方说明页面及实例:https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API 最终效果&…...
2024/5/2 15:59:31 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - 16个Python接单平台,做私活爽歪歪!(附100个爬虫源码)
一、python爬虫是可以做副业的,主要是爬取网站、小程序或者APP的数据,对数据进行分析与处理,或者直接向客户提供爬虫程序与技术支持。 当初学会Python那会儿,有朋友来介绍我去接私活,是为一家公司做网站,那…...
2024/5/1 13:37:03 - 通过mapreduce程序统计旅游订单(wordcount升级版)
通过mapreduce程序统计旅游订单(wordcount升级版) 本文将结合一个实际的MapReduce程序案例,探讨如何通过分析旅游产品的预订数据来揭示消费者的偏好。 程序概览 首先,让我们来看一下这个MapReduce程序的核心代码。这个程序的目…...
2024/5/1 14:04:45 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/2 9:28:15 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/2 15:04:34 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/2 9:07:46 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57