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

Socks5代理服务器示例详解

Go语言中变量的声明和JavaScript很像,使用var关键字,变量的声明、定义有好几种形式

  1. 变量和常量
// 声明并初始化一个变量
var m int = 10
// 声明初始化多个变量
var i, j, k = 1, 2, 3
// 多个变量的声明(注意小括号的使用)
var(no intname string
)
// 声明时不指明类型,通过初始化值来推导
var b = true // bool型
// := 隐含声明变量并赋值
str := "mimvp.com"  // 等价于var str string = "mimvp.com"

Go 语言中 = 和 := 有什么区别?

= 是赋值, := 是声明变量并赋值

// = 使用必须使用先var声明例如:
var a
a = 100
// 或
var b = 100
// 或
var c int = 100
// := 是声明并赋值,并且系统自动推断类型,不需要var关键字
d := 100
// Go中有一个特殊的变量下划线"_" 表示任何赋给它的值将被丢弃
_, Ret:= 2, 3  // 2赋值被丢弃

Go语言的编译器,对声明却未使用的变量在报错,因此变量声明了就必须使用,如果要使用变量也必须先声明

Go语言和C语言一样,Go语言中也是使用分号来终结语句。但是和C语言不同的是,Go语言的词法分析器在扫描源代码的过程中使用简单的规则自动插入分号,因此在编写源代码的多数时候就不需要加分号了

Go语言词法分析器插入分号的规则:如果在一个新行前方的最后一个标记是一个标识符(包括像int和float64这样的单词)、一个基本的如数值这样的文字、或以下标记中的一个时,会自动插入分号

Go语言通常仅在for语句中使用分号,以此来分开初始化器、添加和增量。还有一种情况就是当你在一行中写了多个语句,也需要使用分号来分开

由于Go语言词法分析器添加分号的特殊性,所以在有些情况下需要注意:

你都不应该将一个控制结构(if、for、switch或select)的左大括号放在下一行。

如果这样做,将会在大括号的前方插入一个分号,这可能导致出现不想要的结果。
请添加图片描述

常量:在程序不能被改变的值,一般都定义为数值,布尔值,字符串等

格式:const constName [type] = val

1). var num = 3 // 实际上 3 也称为常量

2). 格式中 val 可以是表达式,但不能为运行时才能知道结果的表达式

3). 预定义常量: true / false / iota

4). 定义多个常量时,也可用下面方式

const ( constName1 [type] = val1 constName2 [type] = val2 
)

示例代码:

/**
* mimvp.com
* 2017.1.20
*/
// 声明当前文件所属的包名,main是一个可独立运行的包,编译后会生成可执行文件 
package main 
import "fmt" // 导入包 
var id = 123456 
/* 
id2 := 654321 
// 在函数外用 := ,编译时会出现错误,局部变量声明应在函数内部
// non-declaration statement outside function body 
*/ 
const PI = 3.14  // 常量声明
// 每个可独立运行的程序,都包含入口函数 main ,与其他语言相同,但无参数和返回值 
func main() { var num int num = 100 fmt.Println(num)  // 输出 100 var num1, num2 int num1, num2 = 1, 2 fmt.Println(num1, num2) // 输出 1 2 var no1, no2 = 3, 4 fmt.Println(no1, no2)  // 输出 3 4 n1, n2 := 5, 6 fmt.Println(n1, n2)  // 输出 5 6 _, n := 7, 8 fmt.Println(n)    // 输出 8 var ( key1 string key2 string ) key1, key2 = "k1", "k2"fmt.Println(key1, key2) // 输出 k1 k2 var ( a = 9 b = 10 ) fmt.Println(a, b)   // 输出 9 10 fmt.Println(id)   // 输出 123456 fmt.Println(PI)   // 输出 3.14 /* PI = 3.1415 // 改变常量的值,编译会出现错误 // cannot assign to PI // cannot use 3.1415 (type float64) as type ideal in assignment */ 
}
  1. 函数使用

1)Go语言函数格式

func GetMsg(i int) (str string) {fmt.Println(i)str = "hello mimvp.com"return str
}

解释说明:

func 说明这是个函数

GetMsg是函数名

(i int) 函数接收一个int参数,是传入参数

(str string) 函数返回一个string类型返回值,是返回参数

2)Go语言函数可返回多个值

函数返回多个值,跟Java、PHP、C等主流语言都不一样,但和Python、lua等脚本语言是一样的

<span style="color:#0000FF;">vim mimvp_func.go</span>
func GetMsg(i int) (str string, err string) {fmt.Println(i)str = "hello mimvp.com"err = "no err"return str, err
}
func main() {fmt.Println(GetMsg(100))

编译执行:

$ go build mimvp_func.go 
$ ./mimvp_func   
100
hello mimvp.com no err

3)defer的使用

defer的意思是"在函数退出时调用",特别用于对文件进行读写操作的时候,需要在open之后要调用close操作,将close操作使用defer

func ReadFile(filePath string)(){file.Open(filePath)defer file.Close()if true {file.Read()} else {return false}
}

上述代码含义是在file.Open后不立即调用close,当return false的时候调用file.Close(),这样就有效避免了C语言中的内存泄露问题。

4)理解 panic,recover

上面讲述了很多变量和函数,还没介绍 throw - try - catch 的用法

Go语言里,Panic和Recover就是其他语言中的throw和catch

示例代码:

package main
import "fmt"
func main() {f()fmt.Println("Returned normally from f.")
}
func f() {defer func() {if r := recover(); r != nil {fmt.Println("Recovered in f", r)}}()fmt.Println("Calling g.")g(0)fmt.Println("Returned normally from g.")
}
func g(i int) {if i > 3 {fmt.Println("Panicking!")panic(fmt.Sprintf("%v", i))}defer fmt.Println("Defer in g", i)fmt.Println("Printing in g", i)g(i + 1)
}

运行结果:

$ ./mimvp-try-catch  
Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.

Panic抛出了信息,并且跳出函数。Recover接受到了信息,并且继续处理。

这个例子理解了基本就掌握了Recover和Panic

  1. Socks5代理服务器
package main
import ("net""fmt""io""bytes""encoding/binary"
)
type Methods struct{ver, nmethods uint8methods uint8
}
type sock5cmd struct{ver, cmd, rsv, atyp uint8dst [255]uint8
}
type proxyCoder struct {conn net.Conn
}
func (c *proxyCoder) readMethods() Methods {var m Methodsb := make([]byte, 1024)n, err := c.conn.Read(b)if err != nil && err != io.EOF { panic(err) }buf := bytes.NewBuffer(b[0:n])err = binary.Read(buf, binary.LittleEndian, &m.ver)if err != nil {fmt.Println("binary.Read failed:", err)}err = binary.Read(buf, binary.LittleEndian, &m.nmethods)if err != nil {fmt.Println("binary.Read failed:", err)}err = binary.Read(buf, binary.BigEndian, &m.methods)if err != nil {fmt.Println("binary.Read failed:", err)}return m
}
func (c *proxyCoder) returnMethod() {buf := make([]byte, 2)buf[0] = 5buf[1] = 0c.conn.Write(buf)fmt.Println(buf)
}
func (c *proxyCoder) serve() {buf := make([]byte, 128)n, err := c.conn.Read(buf)if err != nil && err != io.EOF { panic(err) }fmt.Println(buf[:n])var s stringvar t stringvar i intif(buf[3] == 3){//domailfor i = 4; i < n-2; i++ {s += fmt.Sprintf("%c", buf[i])}} else {//ip4 or ip6s += fmt.Sprintf("%d", buf[4])for i = 5; i < n-2; i++ {s += fmt.Sprintf(".%d", buf[i])}}p := make([]byte, 2)var port uint16p[1] = buf[n-1]p[0] = buf[n-2]b := bytes.NewBuffer(p)err = binary.Read(b, binary.BigEndian, &port)if err != nil {fmt.Println("binary.Read failed:", err)}s += fmt.Sprintf(":%d", port)switch buf[1] {case 1://TCPt = "tcp"case 2://BINDcase 3://UDPt = "udp"}conn, err := net.Dial(t, s)if err != nil {fmt.Printf("%s connect error %s\n", t, s)buf[1] = 4c.conn.Write(buf[:n])c.conn.Close()return}buf[1] = 0c.conn.Write(buf[:n])fmt.Printf("%s connect success %s\n", t, s)go serv(conn, c.conn)go serv(c.conn, conn)
}
func serv(in net.Conn, out net.Conn){b := make([]byte, 10240)for ;;{n, err := in.Read(b)if( err != nil ){fmt.Printf("close\n")in.Close()out.Close()return}fmt.Printf("serv %d\n", n)out.Write(b[:n]);}
}
type Proxy struct {
}
func NewProxy() *Proxy {return &Proxy{}
}
var DefaultProxy = NewProxy()
func (p *Proxy) ProxyConn(conn net.Conn ){c := &proxyCoder{conn}m := c.readMethods()fmt.Println(m)c.returnMethod()c.serve()
}
func handleConnection(conn net.Conn){buf := make([]byte, 1024)n, err := conn.Read(buf)if err != nil && err != io.EOF { panic(err) }fmt.Println(buf[:n])//answerbuf[0] = 5buf[1] = 0conn.Write(buf[:2])fmt.Println(buf[:2])//serven, err = conn.Read(buf)if err != nil && err != io.EOF { panic(err) }fmt.Println(buf[:n])conn.Close()
}
func main() {![请添加图片描述](https://img-blog.csdnimg.cn/94ca1460a5d9411ea13b9a4f63aa3c30.png)ln, err := net.Listen("tcp", ":1080")if err != nil {fmt.Printf("bind error\n")return}for {conn, err := ln.Accept()if err != nil {fmt.Printf("accept error\n")continue}go DefaultProxy.ProxyConn(conn)//go handleConnection(conn)}
}

相关文章:

Socks5代理服务器示例详解

Go语言中变量的声明和JavaScript很像&#xff0c;使用var关键字&#xff0c;变量的声明、定义有好几种形式 变量和常量 // 声明并初始化一个变量 var m int 10 // 声明初始化多个变量 var i, j, k 1, 2, 3 // 多个变量的声明(注意小括号的使用) var(no intname string ) //…...

使用 Docker 和 Nginx 反向代理访问 ChatGPT API

在许多应用程序中&#xff0c;我们需要从一个外部服务中获取数据。然而&#xff0c;由于种种原因&#xff08;例如跨域问题、API 访问限制等&#xff09;&#xff0c;我们可能无法直接从客户端访问这些服务。这时&#xff0c;反向代理可以成为我们的救星。在这篇文章中&#xf…...

[前端笔记038]vue2之vueRouter、elementUI

前言 本笔记参考视频&#xff0c;尚硅谷:BV1Zy4y1K7SH p117 - p135 相关理解 vue 的一个插件库&#xff0c;专门用来实现SPA 应用单页 Web 应用&#xff08;single page web application&#xff0c;SPA&#xff09;&#xff0c;整个应用只有一个完整的页面点击页面中的导航…...

ChatGPT使用案例之操作Excel

ChatGPT使用案例之操作Excel 微软已经通过其官网宣布,正在将其基于GPT-4的人工智能(AI)技术植入到其Office办公软件当中,该功能名为“Microsoft 365 Copilot”。微软称其是基于大语言模型的下一代AI生产力技术,目前已经向部分商业用户开放。 Microsoft 365 负责人Jared …...

【算法基础】(二)数据结构 --- 单链表

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#xff0c;互相监督打卡学习 &#x1f339; &#x1f339; &#x1f3…...

STL容器之<multiset>

文章目录测试环境multiset介绍头文件模块类定义对象构造初始化元素访问元素插入和删除元素查找容器大小迭代器其他函数测试环境 系统&#xff1a;ubuntu 22.04.2 LTS 64位 gcc版本&#xff1a;11.3.0 编辑器&#xff1a;vsCode 1.76.2 multiset介绍 关联式容器。元素是唯一的…...

python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(三)(附python示例代码)

目录 Python numpy.finfo()函数 Python Numpy MaskedArray.masked_less()函数 Python Numpy MaskedArray.masked_less_equal()函数 Python Numpy MaskedArray.masked_not_equal()函数 Python Numpy MaskedArray masked_outside()函数 Python Numpy MaskedArray.masked_wh…...

【Android笔记89】Android之全局加载框Gloading的使用

这篇文章,主要介绍Android之全局加载框Gloading的使用。 目录 一、Gloading全局加载框 1.1、Gloading介绍 1.2、Gloading运行效果 1.3、Gloading的使用...

php微信小程序java+Vue高校课程课后辅导在线教育系统nodejs+python

目 录 1绪论 1 1.1项目研究的背景 1 1.2开发意义 1 1.3项目研究现状及内容 5 1.4论文结构 5 2开发技术介绍 7 2.1 B/S架构 7 2.2 MySQL 介绍 7 2.3 MySQL环境配置 7 2.5微信小程序技术 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.1.3操作可行性 10 …...

公司刚来的00后真卷,上班还没2年,跳到我们公司起薪20k....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…...

Intel 处理器 macOS降级到Big Sur

1 创建可引导的 macOS 安装器 将移动硬盘作安装 Mac 操作系统的启动磁盘。 创建可引导安装器需要满足的条件 移动硬盘&#xff08;格式化为 Mac OS 扩展格式&#xff09;&#xff0c;至少有 14GB 可用空间已下载 macOS Big Sur的安装器 2 下载 macOS macOS Big Sur安装器会…...

【网络安全】记一次红队渗透实战项目

一、信息收集 信息收集非常重要&#xff0c;有了信息才能知道下一步该如何进行&#xff0c;接下来将用 nmap 来演示信息收集 1、nmap 扫描存活 IP 由于本项目环境是 nat 模式需要项目 IP 地址&#xff0c;扫描挖掘本地的 IP 地址信息&#xff1a; 本机 IP 为&#xff1a;192…...

异想天开!没有CPU的操作系统

【引子】“The Last CPU”&#xff08;https://doi.org/10.1145/3458336.3465291&#xff09;&#xff0c;ACM上的这一篇论文非常有趣&#xff0c;核心思想是如果计算机的体系结构中没有了CPU&#xff0c;那么&#xff0c;操作系统又会是怎样的呢&#xff1f;......不敢私藏&am…...

ChatGPT背后的指令学习是什么?PSU最新首篇《指令学习》技术全面综述,详述指令学习关键问题

来源: 专知 任务语义可以用一组输入到输出的例子或一条文本指令来表示。传统的自然语言处理(NLP)机器学习方法主要依赖于大规模特定任务样本集的可用性。出现了两个问题: 首先&#xff0c;收集特定于任务的标记示例&#xff0c;不适用于任务可能太复杂或太昂贵而无法注释&#…...

【Python】《我的世界》简简单单就可以完成?OMG~(附教学)

文章目录前言一、准备二、运行及操作三.代码解读与自定义总结前言 《我的世界 Minecraft》大家应该都听说过&#xff0c;但你有没有想过自己写一个这样的游戏呢&#xff1f;太难、太复杂了&#xff1f;也许吧&#xff0c;但是不试一试你怎么知道能不能成呢&#xff1f; 国外有…...

【SpringSecurity】认证授权框架——SpringSecurity使用方法

【SpringSecurity】认证授权框架——SpringSecurity使用方法 文章目录【SpringSecurity】认证授权框架——SpringSecurity使用方法1. 概述2. 准备工作2.1 引依赖2.2 测试3. 认证3.1 认证流程3.2 登录校验问题3.3 实现3.3.1 实现UserDetailsService接口3.3.2 密码存储和校验3.3.…...

java的Lambda表达式与方法引用详解

1. 定义 Lambda 表达式&#xff0c;也可称为闭包&#xff0c;它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数&#xff08;函数作为参数传递进方法中&#xff09;。 使用 Lambda 表达式可以使代码变的更加简洁紧凑。 1.1 通用定义 lambda 表达…...

JUnit5用户手册~并行执行

两种运行模式 SAME_THREAD&#xff1a;默认的&#xff0c;测试方法在同一个线程CONCURRENT&#xff1a;并行执行&#xff0c;除非有资源锁junit-platform.properties配置参数配置所有测试方法都并行 junit.jupiter.execution.parallel.enabled true junit.jupiter.execution.…...

【从零开始学习 UVM】3.3、UVM TestBench架构 —— UVM Environment [uvm_env]

文章目录 什么是UVM Environment?为什么验证组件不应该直接放置在test class中?创建UVM环境的步骤UVM环境示例Examples环境重用示例什么是UVM Environment? 一个UVM环境包含多个可重用的验证组件,并根据应用程序要求定义它们的默认配置。例如,一个UVM环境可能有多个agent…...

Vue的简单介绍

一、简介 Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xff0c;…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

macOS 终端智能代理检测

&#x1f9e0; 终端智能代理检测&#xff1a;自动判断是否需要设置代理访问 GitHub 在开发中&#xff0c;使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新&#xff0c;例如&#xff1a; fatal: unable to access https://github.com/ohmyzsh/oh…...