SOCKS5代理(源码)

        SOCKS5是个代理服务器协议。

        我这里有个可用的基本实现,下面列出的代码不包含框架和辅助功能,仅包含客户端连接建立后的处理,没有认证(因为用的是IP地址限制,连接建立之前就审查过了)。

        实现不完整,不支持BIND,FTP协议可以使用PASV绕开这个问题。

        没有给出实现的函数基本看名字就可以猜出功能。

        头文件:

//servicethreadsocks.h
//SOCKS协议的处理#ifndef servicethreadsocks_h
#define servicethreadsocks_h//SOCKS协议处理线程
DWORD ServiceThreadSocks(LPDWORD lpdwParam);//版本标识/方法选择
STATE SocksMethodSelect(SOCKET s,char * buf,int buflen,int * cmd,int * method);//方法选择
BYTE SelectMethod(BYTE * msg);//方法:00
//接收用户请求(方法00)
STATE SocksRecvRequest00(SOCKET s,char * buf,int buflen,int * cmd);//命令01(CONNECT)处理(方法00)
STATE SocksCmd01Method00(LPDWORD lpdwParam,SOCKADDR_IN *);//命令03(UDP ASSOCIATE)处理(方法00)
STATE SocksCmd03Method00(LPDWORD lpdwParam,SOCKADDR_IN *);#endif//servicethreadsocks_h

        实现文件:

//servicethreadsocks.cpp#include "stdafx.h"
#include "mystd.h"//SOCKS协议处理线程
DWORD ServiceThreadSocks(LPDWORD lpdwParam)
{
//--线程参数处理------------------------int cdindex;//连接数据索引struct ServiceData * servicedata;cdindex=((struct ThreadUserData *)lpdwParam)->index;servicedata=((struct ThreadUserData *)lpdwParam)->servicedata;
//--------------------------------------struct ConnectionData * cd;struct LogStruct * logs;cd=&servicedata->connectiondataarray.pconnectiondata[cdindex];if(-1!=cd->log){logs=servicedata->memlogfile.logstruct+cd->log;}else{logs=NULL;}
//----------------------------------------struct ConfigInfo * pci;pci=&servicedata->serviceconfigfiledata.configarray[cd->serviceindex];int method;char host[256];SOCKADDR_IN sa;char resp[10];//构造错误应答resp[0]=5;//版本//resp[1]=//应答resp[2]=0;//保留resp[3]=1;//IPV4memset(resp+4,0,6);//退出?if(CONNECTIONDATA_CMD_QUIT==cd->cmd){closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-1;}//版本标识/方法选择过程,method返回选中的方法//隐含调用SelectMethod选择一个方法if(1!=SocksMethodSelect(cd->sdc.s,cd->sdc.buf,BUFFERSIZE,&cd->cmd,&method)){closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-2;}//方法子协商结果,仅支持无认证(方法0x00)switch(method){case 0x00://无认证break;case 0xff://没有可接受的方法default:closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-3;}//接收用户请求if(1!=SocksRecvRequest00(cd->sdc.s,cd->sdc.buf,BUFFERSIZE,&cd->cmd)){closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-4;}//记录日志if(-1!=cd->log){time(&logs->timestart);}//取得目标主机switch((BYTE)cd->sdc.buf[3]){case 0x01://IP V4memcpy(&(sa.sin_addr.S_un.S_addr),cd->sdc.buf+4,4);sa.sin_family=AF_INET;memcpy(&sa.sin_port,cd->sdc.buf+8,2);if(-1!=cd->log){strcpy(logs->domainname,inet_ntoa(sa.sin_addr));}break;case 0x03://domain nameif(cd->sdc.buf[4]>=256){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-5;}memcpy(host,cd->sdc.buf+5,cd->sdc.buf[4]);host[cd->sdc.buf[4]]='\0';if(1!=GetAddrByHost(sa.sin_addr.S_un.S_addr,host)){resp[1]='\x04';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-5;}sa.sin_family=AF_INET;memcpy(&sa.sin_port,cd->sdc.buf+4+1+cd->sdc.buf[4],2);if(-1!=cd->log){strcpy(logs->domainname,host);}break;case 0x04://IP V6default:resp[1]='\x08';send(cd->sdc.s,resp,10,0);//0x08,地址类型不支持closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return (DWORD)-6;break;}//转移至命令处理,在命令处理内部结束所有操作switch(method){case 0x00://无认证switch(cd->sdc.buf[1]){case 0x01://CONNECTif(pci->isenablesocksconnect)SocksCmd01Method00(lpdwParam,&sa);else{resp[1]='\x02';//请求因不符合规则而被拒绝send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;}break;case 0x03://UDP ASSOCIATEif(-1!=cd->log){mystrcat(logs->domainname,256," - UDP ASSOCIATE",FALSE);}SocksCmd03Method00(lpdwParam,&sa);break;case 0x02://BIND//直接下落default:resp[1]='\x07';//命令未实现send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;break;}break;default:break;}//结束,不做任何处理return 1;
}//版本标识/方法选择
STATE SocksMethodSelect(SOCKET s,char * buf,int buflen,int * cmd,int * method)
{BYTE nmethods;int recvcount=0;int recvall=0;BOOL tempbool;struct timeval timeout;timeout.tv_sec=0;timeout.tv_usec=100000;//接收消息for(;1;){//退出?if(CONNECTIONDATA_CMD_QUIT==*cmd){return -1;}if(1!=IsSocketReadReady(s,timeout,tempbool)){return -2;}if(tempbool){recvcount=recv(s,buf+recvall,buflen-recvall,0);}else{continue;}if(SOCKET_ERROR==recvcount){return -3;}else if(0==recvcount){return -4;}recvall+=recvcount;if(recvall>=1){if(0x05!=(BYTE)buf[0]){return -5;}}if(recvall>2){nmethods=buf[1];if(recvall>=nmethods+2){break;}}}//选择方法*method=SelectMethod((BYTE*)buf);buf[1]=(BYTE)(*method);//发送 方法选择 消息if(SOCKET_ERROR==send(s,buf,2,0)){return -6;}return 1;
}//方法选择
BYTE SelectMethod(BYTE * msg)
{int i;for(i=msg[1];i;i--){if(0x00==msg[i+1]){return msg[i+1];}}return 0xff;
}//接收用户请求(方法0x00)
STATE SocksRecvRequest00(SOCKET s,char * buf,int buflen,int * cmd)
{BYTE atyp;BOOL isrecvend=FALSE;int recvcount=0;int recvall=0;BOOL tempbool;struct timeval timeout;timeout.tv_sec=0;timeout.tv_usec=100000;//接收消息for(;1;){//退出?if(CONNECTIONDATA_CMD_QUIT==*cmd){return -1;}if(1!=IsSocketReadReady(s,timeout,tempbool)){return -2;}if(tempbool){recvcount=recv(s,buf+recvall,buflen-recvall,0);}else{continue;}if(SOCKET_ERROR==recvcount){return -3;}else if(0==recvcount){return -4;}recvall+=recvcount;if(recvall>=1){if(0x05!=(BYTE)buf[0]){return -5;}}if(recvall>6){atyp=buf[3];switch(atyp){case 0x01://IP V4if(recvall>=10){isrecvend=TRUE;}break;case 0x03://domain nameif(recvall>=7+buf[4]){isrecvend=TRUE;}break;case 0x04://IP V6if(recvall>=22){isrecvend=TRUE;}break;}}if(isrecvend){break;}}return 1;
}//*命令01(CONNECT)处理(方法00)
STATE SocksCmd01Method00(LPDWORD lpdwParam,SOCKADDR_IN * psa)
{
//--线程参数处理------------------------int cdindex;//连接数据索引struct ServiceData * servicedata;cdindex=((struct ThreadUserData *)lpdwParam)->index;servicedata=((struct ThreadUserData *)lpdwParam)->servicedata;
//--------------------------------------struct ConnectionData * cd;struct LogStruct * logs;cd=&servicedata->connectiondataarray.pconnectiondata[cdindex];if(-1!=cd->log){logs=servicedata->memlogfile.logstruct+cd->log;}else{logs=NULL;}
//----------------------------------------char str[256];char str2[256];char * pstr;char resp[10];//构造应答resp[0]=5;//版本//resp[1]=//应答resp[2]=0;//保留resp[3]=1;//IPV4memcpy(resp+4,&psa->sin_addr.S_un.S_addr,4);memcpy(resp+8,&psa->sin_port,2);//建立SOCKETif(INVALID_SOCKET==(cd->sdr.s=socket(AF_INET,SOCK_STREAM,0))){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}//退出?if(CONNECTIONDATA_CMD_QUIT==cd->cmd){closesocket(cd->sdc.s);closesocket(cd->sdr.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -2;}//连接if(SOCKET_ERROR==connect(cd->sdr.s,(struct sockaddr *)psa,sizeof(*psa))){resp[1]='\x04';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);closesocket(cd->sdr.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -3;}else{resp[1]='\x00';send(cd->sdc.s,resp,10,0);if(-1!=cd->log){strcpy(logs->domainname,"SOCKS:CONNECT -> ");strcpy(str,"");switch((BYTE)cd->sdc.buf[3]){case 0x01://IP V4if(NULL!=(pstr=inet_ntoa(psa->sin_addr))){strcpy(str,pstr);}else{strcpy(str,"???");}break;case 0x03://domain namememcpy(str,cd->sdc.buf+5,cd->sdc.buf[4]);str[cd->sdc.buf[4]]='\0';break;case 0x04://IP V6strcpy(str,"IP V6 - 未支持的");break;}mystrcat(logs->domainname,256,str,TRUE);strcpy(str," : ");itoa(ntohs(psa->sin_port),str2,10);mystrcat(str,256,str2,TRUE);mystrcat(logs->domainname,256,str,FALSE);}}//退出?if(CONNECTIONDATA_CMD_QUIT==cd->cmd){closesocket(cd->sdc.s);closesocket(cd->sdr.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -4;}//接收数据并发给客户TransData(cd->sdr.s,cd->sdc.s,cd->sdr.buf,BUFFERSIZE,&cd->cmd,&cd->sdr.bufcount,servicedata,cd);//记录字节数if(-1!=cd->log){logs->bytecount+=cd->sdr.bufcount;}//结束closesocket(cd->sdc.s);closesocket(cd->sdr.s);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return 1;
}//命令03(UDP ASSOCIATE)处理(方法00)
STATE SocksCmd03Method00(LPDWORD lpdwParam,SOCKADDR_IN * psa)
{
//--线程参数处理------------------------int cdindex;//连接数据索引struct ServiceData * servicedata;cdindex=((struct ThreadUserData *)lpdwParam)->index;servicedata=((struct ThreadUserData *)lpdwParam)->servicedata;
//--------------------------------------struct ConnectionData * cd;struct LogStruct * logs;cd=&servicedata->connectiondataarray.pconnectiondata[cdindex];if(-1!=cd->log){logs=servicedata->memlogfile.logstruct+cd->log;}else{logs=NULL;}
//----------------------------------------SOCKET udpsocket;//与远程服务器连接,sdr实际与客户连接int fromlen=sizeof(SOCKADDR_IN);SOCKADDR_IN udpsa;char host[256];char resp[10];BOOL tempbool;struct timeval timeout;timeout.tv_sec=0;timeout.tv_usec=100000;int i;//构造应答resp[0]=5;//版本//resp[1]=//应答resp[2]=0;//保留resp[3]=1;//IPV4//建立客户端 UDP SOCKETif(INVALID_SOCKET==(cd->sdr.s=socket(AF_INET,SOCK_DGRAM,0))){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}//bindudpsa.sin_family=AF_INET;udpsa.sin_addr.S_un.S_addr=servicedata->serviceconfigfiledata.configarray[cd->serviceindex].sa.sin_addr.S_un.S_addr;udpsa.sin_port=0;if(SOCKET_ERROR==bind(cd->sdr.s,(sockaddr *)&udpsa,sizeof(SOCKADDR_IN))){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}//connectudpsa.sin_family=AF_INET;if(0==psa->sin_addr.S_un.S_addr)udpsa.sin_addr.S_un.S_addr=((SOCKADDR_IN *)(&cd->saSC))->sin_addr.S_un.S_addr;elseudpsa.sin_addr.S_un.S_addr=psa->sin_addr.S_un.S_addr;memcpy(&udpsa.sin_port,&psa->sin_port,2);if(SOCKET_ERROR==connect(cd->sdr.s,(sockaddr *)&udpsa,sizeof(SOCKADDR_IN))){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}i=sizeof(SOCKADDR_IN);if(SOCKET_ERROR==getsockname(cd->sdr.s,(sockaddr *)&udpsa,&i)){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}memcpy(resp+4,&servicedata->serviceconfigfiledata.configarray[cd->serviceindex].sa.sin_addr.S_un.S_addr,4);//设置应答memcpy(resp+8,&udpsa.sin_port,2);//建立服务器端 UDP SOCKETif(INVALID_SOCKET==(udpsocket=socket(AF_INET,SOCK_DGRAM,0))){resp[1]='\x01';send(cd->sdc.s,resp,10,0);closesocket(cd->sdc.s);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -1;}//发送应答resp[1]=0;if(SOCKET_ERROR==send(cd->sdc.s,resp,10,0)){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -2;}//退出?if(CONNECTIONDATA_CMD_QUIT==cd->cmd){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){logs->state=LOGSTRUCT_STATE_NOUSE;}cd->state=CONNECTION_NOUSE;return -2;}int i_Perm;IN_ADDR     ipSC;bool bret;int userindex;int reason;//转发数据报i_Perm=0;for(;1;){//根据IP检查用户许可i_Perm++;if(i_Perm>=300 && servicedata->userfiledata.IsCheckUser){i_Perm=0;memcpy(&ipSC,cd->saSC.sa_data+2,4);if(1!=IsUserPermission(&servicedata->userfiledata,ipSC,&bret,&userindex,&reason))break;if(!bret)break;}//检查发起连接是否已经关闭if(1!=IsSocketReadReady(cd->sdc.s,timeout,tempbool)){break;}if(tempbool){cd->sdc.bufcount=recv(cd->sdc.s,cd->sdc.buf,BUFFERSIZE,0);if(0==cd->sdc.bufcount || SOCKET_ERROR==cd->sdc.bufcount){break;}}//检查来自客户的数据if(1!=IsSocketReadReady(cd->sdr.s,timeout,tempbool)){break;}if(tempbool){cd->sdr.bufcount=recvfrom(cd->sdr.s,cd->sdr.buf,BUFFERSIZE,0,(sockaddr *)&udpsa,&fromlen);if(0==cd->sdr.bufcount || SOCKET_ERROR==cd->sdr.bufcount){break;}//取得目标主机switch((BYTE)cd->sdr.buf[3]){case 0x01://IP V4memcpy(&(udpsa.sin_addr.S_un.S_addr),cd->sdr.buf+4,4);udpsa.sin_family=AF_INET;memcpy(&udpsa.sin_port,cd->sdr.buf+8,2);cd->sdr.bufcount-=10;memmove(cd->sdr.buf,cd->sdr.buf+10,cd->sdr.bufcount);//MessageBox(NULL,inet_ntoa(udpsa.sin_addr),"IP",MB_OK);//这一句显示目标地址break;case 0x03://domain namememcpy(host,cd->sdr.buf+5,cd->sdr.buf[4]);host[cd->sdr.buf[4]]='\0';if(1!=GetAddrByHost(udpsa.sin_addr.S_un.S_addr,host)){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return (DWORD)-5;}udpsa.sin_family=AF_INET;memcpy(&udpsa.sin_port,cd->sdr.buf+4+1+cd->sdr.buf[4],2);cd->sdr.bufcount-=6+1+cd->sdr.buf[4];memmove(cd->sdr.buf,cd->sdr.buf+6+1+cd->sdr.buf[4],cd->sdr.bufcount);break;case 0x04://IP V6closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return (DWORD)-6;break;}//sendif(SOCKET_ERROR==sendto(udpsocket,cd->sdr.buf,cd->sdr.bufcount,0,(sockaddr *)&udpsa,sizeof(SOCKADDR_IN))){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return -2;}if(-1!=cd->log){logs->bytecount+=cd->sdr.bufcount;}}//检查来自远端的数据if(1!=IsSocketReadReady(udpsocket,timeout,tempbool)){break;}if(tempbool){cd->sdr.bufcount=recvfrom(udpsocket,cd->sdr.buf,BUFFERSIZE,0,(sockaddr *)&udpsa,&fromlen);if(0==cd->sdr.bufcount || SOCKET_ERROR==cd->sdr.bufcount || cd->sdr.bufcount>BUFFERSIZE-10){if(SOCKET_ERROR==cd->sdr.bufcount && 10054==WSAGetLastError()){continue;}break;}memmove(cd->sdr.buf+10,cd->sdr.buf,cd->sdr.bufcount);cd->sdr.bufcount+=10;cd->sdr.buf[0]=0;cd->sdr.buf[1]=0;cd->sdr.buf[2]=0;cd->sdr.buf[3]=1;memcpy(cd->sdr.buf+4,&udpsa.sin_addr.S_un.S_addr,4);memcpy(cd->sdr.buf+8,&udpsa.sin_port,2);//MessageBox(NULL,inet_ntoa(udpsa.sin_addr),"Source IP",MB_OK);//这一句显示源地址//sendif(SOCKET_ERROR==send(cd->sdr.s,cd->sdr.buf,cd->sdr.bufcount,0)){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return -2;}if(-1!=cd->log){logs->bytecount+=cd->sdr.bufcount;}}//退出?if(CONNECTIONDATA_CMD_QUIT==cd->cmd){closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return -2;}}closesocket(cd->sdc.s);closesocket(cd->sdr.s);closesocket(udpsocket);if(-1!=cd->log){time(&logs->timeend);logs->state=LOGSTRUCT_STATE_USED;}cd->state=CONNECTION_NOUSE;return 1;
}

(这里是结束)

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

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

相关文章

SpringBoot的配置文件——.yml和.properties

目录 1. Spring Boot 配置文件的使用场景 2. 配置文件的两种格式 2.0 特殊说明: 2.1 .properties 2.1.1 格式 2.2.2 缺陷 2.2.3 解决中文乱码的问题 2.2 .yml 2.2.3 格式 配置数据库连接 注意转义字符 ​编辑 ​编辑 配置null 配置对象 从.yml读取文件举例 Stud…

设计模式 - 行为型模式考点篇:迭代器模式(概述 | 案例实现 | 优缺点 | 使用场景)

目录 一、行为型模式 一句话概括行为型模式 1.1、迭代器模式 1.1.1、概述 1.1.2、案例实现 1.1.3、优缺点 1.1.4、使用场景 一、行为型模式 一句话概括行为型模式 行为型模式:类或对象间如何交互、如何划分职责,从而更好的完成任务. 1.1、迭代器…

Vuex使用方式及异步问题处理

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 生活的理想,为了不断更新自己 ! 目录 1.Vuex简介: 2.vuex获取值 2.1安装 2.2.菜单栏 2.3.模块 2.4使用 3.改…

vue项目npm intall时发生版本冲突的解决办法

在日常使用命令npm install / npm install XX下载依赖的操作中,我经常会遇到无法解析依赖树的问题(依赖冲突) 当遇到这种情况的时候,可以通过以下命令完成依赖安装: npm install --legacy-peer-deps npm install xxx…

C# OpenVINO 人脸识别

效果 耗时 Preprocess: 1.41ms Infer: 4.38ms Postprocess: 0.03ms Total: 5.82ms 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Text; using Syste…

html关闭空标签

常见的空标签有以下几种示例&#xff1a; <br>&#xff1a;表示换行&#xff0c;没有闭合标签。<hr>&#xff1a;表示水平线&#xff0c;没有闭合标签。<img>&#xff1a;表示图片&#xff0c;没有闭合标签。<input>&#xff1a;表示输入框&#xff0…

关于网络协议的若干问题(三)

1、当发送的报文出问题的时候&#xff0c;会发送一个 ICMP 的差错报文来报告错误&#xff0c;但是如果 ICMP 的差错报文也出问题了呢&#xff1f; 答&#xff1a;不会导致产生 ICMP 差错报文的有&#xff1a; ICMP 差错报文&#xff08;ICMP 查询报文可能会产生 ICMP 差错报文…

如何在Firefox中配置HTTP?

在浏览器中配置HTTP是一个常见的需求&#xff0c;它可以让我们轻松访问需要的网站或保护个人隐私。本文将为您详细介绍如何在Firefox浏览器中配置HTTP应用&#xff0c;帮助您实现无缝的HTTP体验。无论您是初次接触HTTP还是有一定经验的用户&#xff0c;本文都能为您提供实用的操…

玩转ChatGPT:图像识别(vol. 1)

一、写在前面 来了来了&#xff0c;终于给我的账号开放图像识别功能了&#xff0c;话不多说&#xff0c;直接开测&#xff01;&#xff01;&#xff01; 二、开始尝鲜 &#xff08;1&#xff09;咒语&#xff1a; GPT回复&#xff1a; 这幅图显示了从2005年1月到2012年12月的…

pdf怎么合并在一起?

pdf怎么合并在一起&#xff1f;对于pdf合并这个问题&#xff0c;有的小伙伴想很简单&#xff0c;只需要将文件直接复制再其中的一个后面不就完事了吗。其实不然&#xff0c;因为我们如果要是需要将很多文件进行合并的话&#xff0c;就会产生很多问题的。总之&#xff0c;在现在…

【面试经典150 | 哈希表】有效的字母异位词

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;排序方法二&#xff1a;哈希数组 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

什么台灯最好学生晚上用?开学适合孩子学习的台灯

作为学龄期儿童的家长&#xff0c;最担心的就是孩子长时间学习影响视力健康。无论是上网课、写作业、玩桌游还是陪伴孩子读绘本&#xff0c;都需要一个足够明亮的照明环境&#xff0c;因此选购一款为孩子视力发展保驾护航的台灯非常重要。推荐五款适合孩子学习的台灯。 1. 书客…

pytorch的基本运算,是不是共享了内存,有没有维度变化

可以把PyTorch简单看成是Python的深度学习第三方库&#xff0c;在PyTorch中定义了适用于深度学习的基本数据结构——张量&#xff0c;以及张量的各类计算。其实也就相当于NumPy中定义的Array和对应的科学计算方法&#xff0c;正是这些基本数据类型和对应的方法函数&#xff0c;…

AWS SAP-C02教程2--存储资源

存储资源在架构设计中是一个少不了的环节,而在AWS中有不同类型的存储资源,对应会有不同用途不同价格,SAP考试中考察各种存储是少不了,以下是涉及到的存储 目录 1 非结构化存储1.1 EBS(块存储)1.1.1 基本限制1.1.2 类型1.1.3 RAID 配置选项1.1.4 Snapshot1.2 Local Insta…

Java Excel转PDF,支持xlsx和xls两种格式, itextpdf【即取即用】

Java Excel转PDF itextpdf&#xff0c;即取即用 工具方法一、使用方式1、本地转换2、网络下载 二、pom依赖引入三、工具方法三、引文 本篇主要为工具方法整理&#xff0c;参考学习其他博主文章做了整理&#xff0c;方便使用。 工具方法 一、使用方式 1、本地转换 导入依赖创…

nginx https的配置方法

文章目录 安装证书工具安装根证书生成域名证书配置转发 ssl的请求到http请求 安装证书工具 curl ‘http://pan.itshine.cn:5080/?explorer/share/fileOut&shareID64h6PiQQ&path%7BshareItemLink%3A64h6PiQQ%7D%2F%E5%B7%A5%E5%85%B7%2Fmkcert’ > ‘./mkcert’ c…

python opencv 深度学习 指纹识别算法实现 计算机竞赛

1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; python opencv 深度学习 指纹识别算法实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;3分工作量&#xff1a;4分创新点&#xff1a;4分 该项目较为新颖…

ABAP 采购组 条目 Z001 不存在T161内-请检查输入

背景&#xff1a;在ALV报表更改PR采购组 做法&#xff1a;ALV报表取出PR相关数据&#xff0c;直接将采购组列设置为可编辑&#xff0c;然后设置按钮更改逻辑。 操作&#xff1a;将采购组值更新&#xff08;从原来500改为600&#xff09;&#xff0c;然后点更改功能按钮&#xf…

Apache Ranger:(一)安装部署

1.Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。 说白了就是管理大多数框架的授权问题。 …

JVM 入门

文章目录 JVMJVM 垮平台执行其他语言的代码JDK、JRE、JVM各种 Java 虚拟机查看我们本地的虚拟机版本HotSpot 的整体架构 JVM JVM &#xff08;Java Virtual Machine&#xff09;&#xff0c;Java 虚拟机&#xff0c;我们的 Java 代码需编译为 .class 字节码文件&#xff0c;经…