0915,SOCKET网络编程部分,三种I/O多路复用模型(select ,poll,epoll)

目录   nc 127.0.0.1 port

01_socket_client.cc

01_socket_server.cc

02_select_client.cc

02_select_server.cc

03_poll_server.cc

04_epoll_server.cc

01_socket_client.cc

#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <error.h>
#include <error.h>#include <iostream>
#include <string>using std::cout;
using std::endl;
using std::string;int main(int argc,char** argv)
{//socket-->listenfdint listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//sockaddr_in --> connectstruct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family=AF_INET;seraddr.sin_port=htons(atoi(argv[2]));//portseraddr.sin_addr.s_addr=inet_addr(argv[1]);//ipint ret=connect(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"connect");}//三次握手建立成功while(1){cout<<"propose send message to server"<<endl;string line;getline(std::cin,line);ret=send(listenfd,line.data(),line.size(),0);if(ret<0){cout<<"send error"<<endl;}else if(ret==0){cout<<"ret==0"<<endl;}else{cout<<"send sucessfully"<<endl;}char buff[128]={0};ret=recv(listenfd,buff,sizeof(buff),0);if(ret<0){cout<<"recv error"<<endl;}else if(ret==0){cout<<"ret==0"<<endl;}else{cout<<"recv sucessfully>>>"<<buff<<endl;}}close(listenfd);return 0;
}

01_socket_server.cc

#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <error.h>
#include <error.h>#include <iostream>
#include <string>using std::cout;
using std::endl;
using std::string;int main(int argc,char** argv)
{int listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//port ip 复用int opt=1;int retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(opt));if(retval<0){error(1,errno,"setscockopt");}int opt2=1;retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt2,sizeof(opt2));if(retval<0){error(1,errno,"setscockopt2");}//bindstruct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_addr.s_addr=inet_addr(argv[1]);seraddr.sin_port=htons(atoi(argv[2]));seraddr.sin_family=AF_INET;int ret=bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"bind");}//监听ret=listen(listenfd,128);if(ret<0){error(1,errno,"listen");}cout<<"server is listen"<<endl;//从listenfd队列中取下一个peerfdint connfd=accept(listenfd,nullptr,nullptr);if(connfd<0){error(1,errno,"accept");}//三次握手建立成功while(1){char buff[128]={0};ret=recv(connfd,buff,sizeof(buff),0);if(ret<0){cout<<"recv error"<<endl;}else if(ret==0){cout<<"ret==0"<<endl;}else{cout<<"recv sucessfully>>>"<<buff<<endl;}cout<<"propose send message to client"<<endl;string line;getline(std::cin,line);int ret1=send(connfd,line.data(),line.size(),0);if(ret1<0){cout<<"send error"<<endl;}else if(ret1==0){cout<<"ret1==0"<<endl;}else{cout<<"send sucessfully"<<endl;}}close(listenfd);close(connfd);return 0;
}

02_select_client.cc

#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <error.h>
#include <error.h>#include <iostream>
#include <string>#define SERV_IP "192.168.235.128"
#define SERV_PORT 8000using std::cout;
using std::endl;
using std::string;int main(int argc,char** argv)
{//socket-->listenfdint listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//sockaddr_in --> connectstruct sockaddr_in seraddr;memset(&seraddr,0,sizeof(seraddr));seraddr.sin_family=AF_INET;seraddr.sin_port=htons(SERV_PORT);//port/* seraddr.sin_addr.s_addr=inet_addr(SERV_IP);//ip *//* inet_pton(listenfd, SERV_IP, &serv_addr.sin_addr.s_addr); */seraddr.sin_addr.s_addr=htonl(INADDR_ANY);//服务器绑定所有可用接口int ret=connect(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"connect");}//三次握手建立成功char buff[BUFSIZ];//标准io操作的缓冲区大小int nByte;while(1){fgets(buff,sizeof(buff),stdin);//helloc-->hello\n\0write(listenfd,buff,strlen(buff));//buff有效长度//buff的内容写入listenfd(套接字本质文件描述符)nByte=read(listenfd,buff,sizeof(buff));//读取服务器的响应,nByte实际读取的字节数write(STDOUT_FILENO,buff,nByte);//写到stdout}close(listenfd);return 0;
}

02_select_server.cc

#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/socket.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <error.h>
#include <error.h>
#include <sys/select.h>
#include <sys/time.h>#include <iostream>
#include <string>#define SERV_PORT 8000using std::cout;
using std::endl;
using std::string;int main(int argc,char** argv)
{int cnt ;//debugint connfd,sockfd;int listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//port ip 复用int opt=1;int retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(opt));if(retval<0){error(1,errno,"setscockopt");}int opt2=1;retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt2,sizeof(opt2));if(retval<0){error(1,errno,"setscockopt2");}//bindstruct sockaddr_in seraddr;bzero(&seraddr,sizeof(seraddr));/* memset(&seraddr,0,sizeof(seraddr)); */seraddr.sin_addr.s_addr=htonl(INADDR_ANY);seraddr.sin_port=htons(SERV_PORT);seraddr.sin_family=AF_INET;int ret=bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"bind");}//监听ret=listen(listenfd,128);if(ret<0){error(1,errno,"listen");}cout<<"server is listen"<<endl;//三次握手建立成功char buff[BUFSIZ],str[BUFSIZ];int maxfd=listenfd;int maxi=-1;fd_set rset,allset;int client[FD_SETSIZE];//多1024,可以监视的最大文件描述符数量//定义在/usr/include/linux/posix_types.hfor(int i=0;i<FD_SETSIZE;++i){client[i]=-1;}FD_ZERO(&allset);FD_SET(listenfd,&allset);while(1){rset=allset;int nready=select(maxfd+1,&rset,NULL,NULL,NULL);//nready就绪的描述符数量if(nready<0){error(1,errno,"select");}//01,监听到listenfd 新的链接进来if(FD_ISSET(listenfd,&rset)){struct sockaddr_in clie_addr;socklen_t clie_addr_len=sizeof(clie_addr);//新连接的套接字connfd=accept(listenfd,(struct sockaddr*)&clie_addr,&clie_addr_len);if(connfd==-1){error(1,errno,"accept");}printf("receive from %s : %d\n",inet_ntop(AF_FILE,&clie_addr.sin_addr,str,sizeof(str)),ntohs(clie_addr.sin_port));//三次握手成功int i;for(i=0;i<FD_SETSIZE;++i){if(client[i]<0){client[i]=connfd;break;//加入监听数组} }//==============================cout<<cnt++<<"  "<<i<<endl;if(i==FD_SETSIZE){fputs("too much client\n",stderr);exit(1);}FD_SET(connfd,&allset);//添加新连接//更新maxi,maxfdif(connfd>maxfd){maxfd=connfd;}if(i>maxi){maxi=i;}//如果nready=1.继续while循环,不用走下面的for循环if(--nready==0){continue;}}//02遍历client数组,元素为正,被监听到//是老连接,可以进行数据发送接受for(int i=0;i<=maxi;++i){//caution:i<=maxiif((sockfd=client[i])<0){continue;}
//==============================cout<<cnt++<<"  "<<sockfd<<endl;if(FD_ISSET(sockfd,&rset)){int nByte=read(sockfd,buff,sizeof(buff));if(nByte==0){//数据读完了,(缓冲区没有数据//连接要断开了close(sockfd);cout<<"client "<<sockfd<<" closed connection\n"<<endl;FD_CLR(sockfd,&allset);client[i]=-1;}else if(nByte>0){for(int j=0;j<nByte;++j){buff[j]=toupper(buff[j]);//a->A}write(sockfd,buff,nByte);write(STDOUT_FILENO,buff,nByte);}if(--nready==0){break;}}}}close(listenfd);close(connfd);return 0;
}

03_poll_server.cc

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <errno.h>
#include <poll.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>#include <iostream>
#include <string>#define OPEN_MAX 1024
/* #define SERV_IP "192.168.235.128" */
#define SERV_IP "127.0.0.1"
#define SERV_PORT 7888using std::cout;
using std::endl;
using std::string;/* struct pollfd */
/* { */
/*     int   fd;       //要监听的文件描述符 */
/*     short events;   //待监听的文件描述符的事件 POLLIN/POLLOUT/POLLERR */
/*     short revents;  //revents & POLLIN */
/* }; */int main(int argc,char** argv)
{int cnt ;//debugint connfd,sockfd;int listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//port ip 复用int opt=1;int retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(opt));if(retval<0){error(1,errno,"setscockopt");}int opt2=1;retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt2,sizeof(opt2));if(retval<0){error(1,errno,"setscockopt2");}//bindstruct sockaddr_in seraddr;bzero(&seraddr,sizeof(seraddr));/* memset(&seraddr,0,sizeof(seraddr)); */seraddr.sin_addr.s_addr=htonl(INADDR_ANY);/* seraddr.sin_addr.s_addr=inet_pton( *//*        listenfd, SERV_IP, &seraddr.sin_addr.s_addr); */seraddr.sin_port=htons(SERV_PORT);seraddr.sin_family=AF_INET;int ret=bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"bind");}//监听ret=listen(listenfd,128);if(ret<0){error(1,errno,"listen");}cout<<"server is listen"<<endl;//三次握手建立成功char buff[BUFSIZ],str[INET_ADDRSTRLEN];//IPV4地址的字符串表示形式的最大长度int maxi=0;struct pollfd client[OPEN_MAX];//FOPEN_MAX:一个程序可以同时打开的最大文件流数量//poll类型,listenfd加入监听client[0].fd=listenfd;client[0].events=POLLIN;for(int i=1;i<OPEN_MAX;++i){//i=0,会把listenfd删掉,注意初始化顺序client[i].fd=-1;}while(1){int nready=poll(client,maxi+1,-1);if(nready<0){error(1,errno,"select");}
//==============================cout<<cnt++<<"  "<<client[0].fd<<endl;//01,监听到listenfd 新的链接进来if(client[0].revents & POLLIN){struct sockaddr_in clie_addr;socklen_t clie_addr_len=sizeof(clie_addr);//新连接的套接字connfd=accept(listenfd,(struct sockaddr*)&clie_addr,&clie_addr_len);if(connfd==-1){error(1,errno,"accept");}printf("receive from %s : %d\n",inet_ntop(AF_FILE,&clie_addr.sin_addr,str,sizeof(str)),ntohs(clie_addr.sin_port));//三次握手成功int i;for(i=1;i<OPEN_MAX;++i){if(client[i].fd<0){client[i].fd=connfd;break;//加入监听数组} }client[i].events=POLLIN;//设置要监听的类型if(i==OPEN_MAX){fputs("too much client\n",stderr);exit(1);}//更新maxi,fd有新增if(i>maxi){maxi=i;}//如果nready=1.继续while循环,不用走下面的for循环if(--nready==0){continue;}}//02遍历client数组,元素为正,被监听到//是老连接,可以进行数据发送接受for(int i=0;i<=maxi;++i){//caution:i<=maxiif((sockfd=client[i].fd)<0){continue;}//老连接上有数据if(client[i].revents & POLLIN){int nByte=read(sockfd,buff,sizeof(buff));if(nByte<0){if(errno==ECONNRESET){//客户端被强制关闭cout<<"client ["<<i<<"] abort connect"<<endl;close(sockfd);client[i].fd=-1;}else{perror("read nByte=0 error");}}else if(nByte>0){for(int j=0;j<nByte;++j){buff[j]=toupper(buff[j]);//a->A}write(sockfd,buff,nByte);write(STDOUT_FILENO,buff,nByte);}else{close(sockfd);cout<<"client ["<<i<<"] closed connection"<<endl;client[i].fd=-1;}if(--nready==0){break;}}}}close(listenfd);close(connfd);return 0;
}

04_epoll_server.cc

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <error.h>
#include <errno.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/epoll.h>#include <iostream>
#include <string>#define OPEN_MAX 1024
/* #define SERV_IP "192.168.235.128" */
#define SERV_IP "127.0.0.1"
#define SERV_PORT 6888using std::cout;
using std::endl;
using std::string;/* typedef union epoll_data { */
/*     void        *ptr; */
/*     int          fd; */
/*     uint32_t     u32; */
/*     uint64_t     u64; */
/* } epoll_data_t; *//* struct epoll_event { */
/*     uint32_t     events; //EPOLLIN/EPOLLOUT/EPOLLERR */
/*     epoll_data_t data;        /1* User data variable *1/ */
/* }; */int main(int argc,char** argv)
{int cnt ;//debugint connfd,sockfd;int listenfd=socket(AF_INET,SOCK_STREAM,0);if(listenfd<0){error(1,errno,"socket");}//port ip 复用int opt=1;int retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEPORT,&opt,sizeof(opt));if(retval<0){error(1,errno,"setscockopt");}int opt2=1;retval=setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt2,sizeof(opt2));if(retval<0){error(1,errno,"setscockopt2");}//bindstruct sockaddr_in seraddr;bzero(&seraddr,sizeof(seraddr));seraddr.sin_addr.s_addr=htonl(INADDR_ANY);/* seraddr.sin_addr.s_addr=inet_pton( *//*        listenfd, SERV_IP, &seraddr.sin_addr.s_addr); */seraddr.sin_port=htons(SERV_PORT);seraddr.sin_family=AF_INET;int ret=bind(listenfd,(struct sockaddr*)&seraddr,sizeof(seraddr));if(ret<0){error(1,errno,"bind");}//监听ret=listen(listenfd,128);if(ret<0){error(1,errno,"listen");}cout<<"server is listen"<<endl;char buff[BUFSIZ],str[INET_ADDRSTRLEN];//IPV4地址的字符串表示形式的最大长度//创建红黑树的根节点(红黑树+就绪链表)int epfd=epoll_create(OPEN_MAX);/* int epfd=epoll_create1(1); */if(epfd==-1){error(1,errno,"epoll_create1");}//赋值evt,listenfd加入监听struct epoll_event evt,ep[OPEN_MAX];evt.events=EPOLLIN;evt.data.fd=listenfd;ret=epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&evt);if(ret<0){error(1,errno,"epoll_ctl(add) listenfd");}while(1){int nready=epoll_wait(epfd,ep,OPEN_MAX,-1);if(nready<0){error(1,errno,"select");}
//==============================
cout<<cnt++<<"  "<<ep[0].data.fd<<endl;
//递增的ep[0].data.fd,记录的是接收到的事件的数量
//这个上下文中是用来输出当前处理的事件的文件描述符,
//可能会是新连接的文件描述符,所以会看起来是递增的                    //02遍历nreadyfor(int i=0;i<nready;++i){//异常处理if(!(ep[i].events & EPOLLIN)){continue;}//监听到listenfd,新连接//(监听到连接事件)if(ep[i].data.fd == listenfd){struct sockaddr_in clie_addr;socklen_t clie_addr_len=sizeof(clie_addr);//新连接的套接字connfd=accept(listenfd,(struct sockaddr*)&clie_addr,&clie_addr_len);if(connfd==-1){error(1,errno,"accept");}printf("receive from %s : %d\n",inet_ntop(AF_FILE,&clie_addr.sin_addr,str,sizeof(str)),ntohs(clie_addr.sin_port));//三次握手成功//新连接加入监听evt.events=EPOLLIN;evt.data.fd=connfd;ret=epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&evt);if(ret<0){error(1,errno,"epoll_ctl(add) connfd");}}//不是连接事件--> 读写事件-->有消息else {sockfd=ep[i].data.fd;int nByte=read(sockfd,buff,sizeof(buff));//缓冲区空,即将断开if(nByte==0){ret=epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);if(ret<0){error(1,errno,"epoll_ctl(delete)");}close(sockfd);cout<<"client ["<<sockfd<<"] closed connecttion"<<endl;}//连接异常else if(nByte<0){perror("epoll_wait error");ret=epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);if(ret<0){error(1,errno,"epoll_ctl(delete)");}close(sockfd);}//正常通信else{for(int j=0;j<nByte;++j){buff[j]=toupper(buff[j]);//a->A}write(sockfd,buff,nByte);write(STDOUT_FILENO,buff,nByte);}}}}close(listenfd);close(connfd);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

记软件开发者画图(UML),使用WPS应用制图

目录 前言 一、什么是UML 二、使用什么画图工具 三、示例 ​四、IntelliJ IDEA 2021快速生成UML图 前言 做软件开发的从写第一个示例程序到最后写项目程序避不开的需要设计画图&#xff0c;所以今天我们就来梳理一下‌UML&#xff08;统一建模语言&#xff09;图形需要画…

LINUX网络编程:TCP(1)

目录 1.认识Tcp的报头 2.确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 捎带应答 3.超时重传机制 4.Tcp连接管理 三次握手 为什是三次握手 四次挥手 理解TIMEWAIT 1.认识Tcp的报头 源端口和目的端口号没什么说的 32位的序号和确认序号&#xff0c;之后会介…

T9-猫狗识别2(暂时版qaq)

T9周&#xff1a;猫狗识别2 **一、前期工作**1.设置GPU,导入库2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****五、训练模型****六、模型评估****七、预测**八、总结&#xff08;暂时&#xff09; &…

倒排索引(反向索引)

倒排索引&#xff08;Inverted Index&#xff09;是搜索引擎和数据库管理系统中常用的一种数据结构&#xff0c;用于快速检索文档集合中的文档。在全文搜索场景中&#xff0c;倒排索引是一种非常高效的手段&#xff0c;因为它能够快速定位到包含特定关键词的所有文档。 1、基本…

【Python技术】使用akshare、pyecharts绘制K线图

下班回到家&#xff0c;回家途中瞄了下股票&#xff0c;大盘又是3000多只股票待涨&#xff0c; 盘中上证指数一度跌破2700。 估计不少人心里不爽&#xff0c;那就聊聊相关技术学习下。 之前写过【python技术】使用akshare、pandas、mplfinance绘制红绿色K线图简单示例 &#x…

Android Retrofit源码分析(一):Retrofit是什么?和OkHttp的区别是什么?为什么需要他?

目录 一、Retrofit是什么? Retrofit是一个基于OKHttp的RESTful网络请求框架,由Square公司开源,专为Android和Java提供类型安全的HTTP客户端。它可以理解为OKHttp的加强版,底层封装了OKHttp,主要负责网络请求接口的封装,使得网络请求工作更加简洁高效。 简单来说,Retro…

GNN-RAG:用于大模型推理的图神经检索

GNN-RAG&#xff1a;用于大模型推理的图神经检索 秒懂大纲提出背景解法拆解全流程优化创意总结 论文&#xff1a;GNN-RAG: Graph Neural Retrieval for Large Language Model Reasoning 代码&#xff1a;https://github.com/cmavro/GNN-RAG 秒懂大纲 ├── GNN-RAG【主题】…

医疗领域患者监控中的手势识别:一种深度卷积神经网络方法

这篇论文的标题是《Hand Gesture Recognition for Patient Monitoring in the Medical Field: A Deep Convolution Neural Networks Approach》&#xff0c;作者们来自印度的Chaitanya Bharathi Institute of Technology电子与通信工程系。论文主要探讨了在医疗领域&#xff0c…

AI大模型之旅--milvus向量库安装

milvus-向量索引库 milvus的官方文档中看到最新版本的部署方式 :https://milvus.io/docs/install_standalone-docker.md 部署 curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh 如果下载不下来&a…

C语言中值传递

C语言中&#xff0c;值传递的问题 #include <stdio.h> void modifyValue(int x) { x 10; // 修改的是x的副本&#xff0c;对原始数据无影响 printf("在函数中修改的结果是:%d\n",x); }int main() { int a 5; printf("Before: %d\n", a); modifyV…

基于协同过滤+SpringBoot+Vue的剧本杀服务平台系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤JavaSpringBootV…

zynq SDK 关于SD卡报错

在修改了BD的部分代码之后&#xff0c;重新综合工程生成bit&#xff0c;之后刷新hdf文件&#xff0c;在SDK端就出现了SD卡相关的函数未定义的报错&#xff1a; Description Resource Path Location Type E:\Work\VivadoPrj\Prj1\project_1\project_1.sdk\Test\Debug/…/src/hel…

29. 查看threejs自带几何体顶点

查看three.js自带几何体顶点结构&#xff0c;基类(父类)BufferGeometry three.js提供的矩形平面PlaneGeometry、长方体BoxGeometry、球体SphereGeometry等各种形状的几何体&#xff0c;他们都有一个共同的父类BufferGeometry。这意味着这些几何体有哪些属性或方法&#xff0c;…

Bigemap GIS Office 2024注册机 全能版地图下载软件

对于需要利用GIS信息进行编辑、设计的用户来说&#xff0c;Bigemap GIS Office占有重要地位。用户可以使用Bigemap GIS Office作为工具进行设计、分析、共享、管理和发布地理信息。Bigemap GIS Office能实现多种数据流转、嵌入、融合以及更多地为用户提供数据的增强处理及多种分…

如何根据协议请求去捕捉在个文件中发出去的

场景&#xff1a;随着业务越来越复杂&#xff0c;一个“触发”可能发出去N个协议&#xff0c;此时有某一个协议发生了报错&#xff0c;需要去找这个协议&#xff0c;去文件中走读逻辑&#xff0c;去找该协议&#xff0c;效率很慢&#xff0c;业务极其复杂的情况下&#xff0c;很…

力扣53-最大子序和(Java详细题解)

题目链接&#xff1a;力扣53-最大子序和 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一个…

【时时三省】(C语言基础)指针笔试题1

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题1: 创建了一个a数组 它有五个元素 五个元素分别是1 2 3 4 5 &a取出来的是一维数组的地址 然后产生的结果强制类型转换了成int &a+1就是从1跳到了5 如下图 再把这个地…

基于SSM+Vue+MySQL的酒店管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着旅游业的蓬勃发展&#xff0c;酒店业作为旅游产业链中的重要一环&#xff0c;面临着日益增长的客户需求和激烈的市场竞争。传统的人工酒店管理模式已难以满足高效、精准、个性化的服务要求。因此&#xff0c;开发一套基于SS…

OpenCV特征检测(6)对初步检测到的角点位置进行亚像素级别的精炼函数cornerSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 细化角点的位置。 该函数迭代以找到角点或径向鞍点的亚像素级准确位置&#xff0c;如 93中所述&#xff0c;并如下图所示。 亚像素级准确的角点…

Unsupervised Deep Representation Learning for Real-Time Tracking

摘要 我们的无监督学习的动机是稳健的跟踪器应该在双向跟踪中有效。具体来说&#xff0c;跟踪器能够在连续帧中前向定位目标对象&#xff0c;并回溯到其在第一帧中的初始位置。基于这样的动机&#xff0c;在训练过程中&#xff0c;我们测量前向和后向轨迹之间的一致性&#xf…