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

电商网站项目网站如何被百度快速收录

电商网站项目,网站如何被百度快速收录,淘宝网站代做,沈阳电子商务网站建设这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只…这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只需要按照这三个写出代码即可  首先就是socks5的认证 Socks5Atuth 这里首先要认证 那么我们首先要确定是不是socks5代理 在socks5中 前两个字节 分别是 socks版本号 和 支持的认证方式 前面两个 1 所以这里我们开始读取前面的 版本号 ver socks5是固定值 0x05 这里开始编写一下监听 package mainimport (bufiofmtlognet )const socks5Ver 0x05 const cmdVer 0x01 const aytpVerIpv4 0x01 const aytpVerUrl 0x03 //这里是下面的常量 不需要理会即可 当作值即可func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accpet error :, err)continue}//确定ip端口 进行链接后 开始进程fmt.Println(开始监听, client, client.RemoteAddr())} } 然后开始处理数据 首先我们需要开启一个协程 处理 func process(conn net.Conn) {defer conn.Close()readio : bufio.NewReader(conn)err : auth(readio, conn) }这里我们首先处理一下认证的信息 // ------------------------// |VER | NMETHODS | METHODS |// ------------------------// | 1 | 1 | 1 to 255 |// ------------------------// VER: 协议版本socks5为0x05// NMETHODS: 支持认证的方法数量// METHODS: 对应NMETHODSNMETHODS的值为多少METHODS就有多少个字节。RFC预定义了一些值的含义内容如下:// X’00’ NO AUTHENTICATION REQUIRED// X’02’ USERNAME/PASSWORD// 版本和NMETHODS值都是单字节的所以ReadByte读一个字节就好了 这里需要认证的东西就是这些 我们首先进行认证 ver func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()fmt.Println(ver)return nil }这里是通过 readbyte 读取一个字节 我们输出一下就知道是多少了 发现我们通过浏览器进行代理 第一个byte是 5 对应 socks5 如果将代理设置为 socks4 那么这里就是对应4 然后这里进行匹配 如果不是就输出错误 这样 ver认证就结束了 认证的ver func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}} 认证method         这里是socks5的认证是否需要认证 methodSize, err : readio.ReadByte()fmt.Println(methodSize)return 其实这里就是读取一个字节的大小 func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}methodSize, err : readio.ReadByte() //确定切片大小 为 1字节method : make([]byte, methodSize) //创建一个大小的切片_, err io.ReadFull(readio, method) // 这里是判断是否读了if err ! nil {return fmt.Errorf(read method error :, err)}_, err conn.Write([]byte{socks5Ver, 0x00}) // 这里是握手的回复 说明我们不需要认证if err ! nil {return fmt.Errorf(write error, err)}return nil } 这里注意 _, err conn.Write([]byte{socks5Ver, 0x00}) 这里其实是监听后告诉 不需要进行 认证 当我们认证完后开始处理浏览器的报文 Socks5Connect // 读取浏览器发送的报文// ------------------------------------------// |VER | CMD | RSV | ATYP | DST.ADDR | DST.PORT |// ------------------------------------------// | 1 | 1 | X00 | 1 | Variable | 2 |// ------------------------------------------// VER 版本号socks5的值为0x05// CMD 0x01表示CONNECT请求// RSV 保留字段值为0x00// ATYP 目标地址类型DST.ADDR的数据对应这个字段的类型。// 0x01表示IPv4地址DST.ADDR为4个字节// 0x03表示域名DST.ADDR是一个可变长度的域名// DST.ADDR 一个可变长度的值// DST.PORT 目标端口固定2个字节这里是浏览器发送的报文 我们依旧先进行鉴定 func connnect(readio *bufio.Reader, conn net.Conn) (err error) {buf : make([]byte, 4)_, err io.ReadFull(readio, buf) // 这里是读取字节数 读取前面4个作为一个切片if err ! nil {return fmt.Errorf(read header error :, err)}var ver, cmd, atyp buf[0], buf[1], buf[3] // 这里对应报文的字节认证的位置fmt.Println(ver, cmd, atyp)return } 这里就很明显了 5 对应 socks5 1 对应 链接的请求 3 对应 url 是一个域名 ------------------------------------------------------------ |VER | CMD | ATYP | HOST SIZE | HOST | ------------------------------------------------------------ | 05 | 01 | 03 | 11 | www.exa.com | ------------------------------------------------------------首先之前的都已经被读了ver cmdatyp然后再读 就是 host size 这里是 后面 host 的地址长度 这里开源发现 cn.bing.com的长度是11 因为url是可变的 所以后面的host也是可变的 我们首先读取字节长度 然后作为 值传递给切片 读取该长度的值 这样我们就开源获取到url地址 _, err io.ReadFull(readio, buf[:2]) //再向后读取两个字节 是portif err ! nil {return fmt.Errorf(port error:, err)}port : binary.BigEndian.Uint16(buf[:2]) //这里是大端序监听端口fmt.Println(port)fmt.Println(addr)return 这里的原理是这样的 首先我们读取两个字节 443 [1 187] 然后进行大端序排序 0 在高 80 在低 这个时候就是 [1 187] 然后我们进uint16处理 [1 187]将高位字节1左移 8 位使其占据 uint16 的高 8 位得到结果 00000001 00000000将低位字节187放在 uint16 的低 8 位得到结果 00000001 1011101100000001 10111011443 这样我们就获取到了端口 然后我们就可以进行拼接url dest : fmt.Sprintf(%v:%v, addr, port) fmt.Println(dest) 然后我们开始建立tcp请求 dest, err : net.Dial(tcp, fmt.Sprintf(%v:%v, addr, port)) //建立tcp协议if err ! nil {return fmt.Errorf(dial error:, err)}defer dest.Close()log.Println(访问:, addr, port) 完整代码 package mainimport (bufiocontextencoding/binaryfmtiolognet )const socks5Ver 0x05 const cmdVer 0x01 const aytpVerIpv4 0x01 const aytpVerUrl 0x03func main() {server, err : net.Listen(tcp, 127.0.0.1:1080)if err ! nil {panic(err)}for {client, err : server.Accept()if err ! nil {log.Printf(Accpet error :, err)continue}//确定ip端口 进行链接后 开始进程fmt.Println(开始监听)go process(client)} } func process(conn net.Conn) {defer conn.Close()readio : bufio.NewReader(conn)err : auth(readio, conn)if err ! nil {fmt.Errorf(ip: %v,auth error :, conn.RemoteAddr().String(), err)}err connnect(readio, conn) }func auth(readio *bufio.Reader, conn net.Conn) (err error) {ver, err : readio.ReadByte()if err ! nil {return fmt.Errorf(ver error:, err)}if ver ! socks5Ver {return fmt.Errorf(ver num error: , err)}methodSize, err : readio.ReadByte() //确定切片大小 为 1字节method : make([]byte, methodSize) //创建一个大小的切片_, err io.ReadFull(readio, method) // 这里是判断是否读了if err ! nil {return fmt.Errorf(read method error :, err)}_, err conn.Write([]byte{socks5Ver, 0x00}) // 这里是握手的回复 说明我们不需要认证if err ! nil {return fmt.Errorf(write error, err)}return nil }func connnect(readio *bufio.Reader, conn net.Conn) (err error) {buf : make([]byte, 4)_, err io.ReadFull(readio, buf) // 这里是读取字节数 读取前面4个作为一个切片if err ! nil {return fmt.Errorf(read header error :, err)}var ver, cmd, atyp buf[0], buf[1], buf[3] // 这里对应报文的字节认证的位置if ver ! socks5Ver {return fmt.Errorf(connect ver error:, err)}if cmd ! cmdVer {return fmt.Errorf(connect cmd error:, err)}addr : switch atyp {case aytpVerIpv4:_, err io.ReadFull(readio, buf)if err ! nil {return fmt.Errorf(ipv4 error:, err)}addr fmt.Sprintf(%d.%d.%d.%d, buf[0], buf[1], buf[2], buf[3]) //读取ip地址case aytpVerUrl: //这里解析的是urlhostSize, err : readio.ReadByte() //获取url的字节长度if err ! nil {return fmt.Errorf(read hostSize failed:%w, err)}host : make([]byte, hostSize) //获取url字符的字节_, err io.ReadFull(readio, host)if err ! nil {return fmt.Errorf(read host failed:%w, err)}addr string(host)default:return fmt.Errorf(not yet, atyp)}_, err io.ReadFull(readio, buf[:2]) //再向后读取两个字节 是portif err ! nil {return fmt.Errorf(port error:, err)}port : binary.BigEndian.Uint16(buf[:2]) //这里是大端序监听端口dest, err : net.Dial(tcp, fmt.Sprintf(%v:%v, addr, port)) //建立tcp协议if err ! nil {return fmt.Errorf(dial error:, err)}defer dest.Close()log.Println(访问:, addr, port)_, err conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0})if err ! nil {return fmt.Errorf(写入错误:, err)}ctx, cancel : context.WithCancel(context.Background()) //启动一个可以取消的上下文功能defer cancel()go func() {_, _ io.Copy(dest, readio) //这里是从我们的请求中读取出来 写入请求中cancel()}()go func() {_, _ io.Copy(conn, dest) //这里从请求中写入返回报文中cancel()}()-ctx.Done() // 这里是 只要管道输出内容了就停止 所以上面两个协程 只要有一个输出 就取消return nil }
http://www.w-s-a.com/news/829143/

相关文章:

  • 免费企业网站源码下载学服装设计需要什么条件
  • 淘宝网站开发方式深圳平面设计公司排名榜
  • 品牌网站建设收费情况登陆页面模板
  • 十大免费cms建站系统介绍科技网站欣赏
  • 自学做网站需要多久semir是什么品牌
  • 南通网站搜索引擎优化网站首页seo关键词布局
  • 东莞市国外网站建设多少钱wordpress 多媒体插件
  • c2c商城网站建设公司做水果生意去哪个网站
  • 做网站服务器有哪些电子商务网站建立
  • 网站开发的具体流程原材料价格查询网站
  • 深圳响应式网站建设深圳网站建设定制开发 超凡科技
  • 网站建设报价怎么差别那么大wordpress产品属性搭配
  • 高校网站建设情况报告范文pc建站网站
  • 做网站美工要学什么广东省建设厅网站首页
  • 深圳网站设计十年乐云seo网站建设 竞赛 方案
  • 新乡移动网站建设wordpress输出某一分类的文章
  • 花店网站开发设计的项目结构重庆网站建设培训班
  • 做网站的技术体系投资者互动平台官网
  • 北京网站建设公司哪家实惠企查查在线查询入口
  • 毕业设计做网站怎么样非微信官方网页自己做的网站
  • 昆明网站多端小程序设计重庆市住房和城乡建设厅网站
  • 网站制作技术人员国际新闻最新10条
  • 做同城特价的网站wordpress后台能修改模板文件
  • 网站信息可以边建设边组织产品展示网站源码php
  • 电子商务网站规划从哪些方面入手途牛企业网站建设方案
  • 莱阳网站定制易语言可以做网站嘛
  • 购物网站开发意义上海中小企业服务中心官网
  • 网站备案证书如何打开江苏网站建设电话
  • 深圳网站建设乐云seo搜索引擎优化seo目的
  • 中山城市建设集团网站网站建设设计基础