今天学了socks代理服务,感觉好难,顺便复习了一下之前的内容
- 猜谜游戏:
-
os.args
os.Args 提供原始命令行参数访问功能。为切片类型,注意,切片中的第一个参数是该程序的路径,并且 os.Args[1:]保存所有程序的的参数。为输入的命令 切片中第一个元素是程序路径,后面的就是参数
- 输入输出:
- reader :=buffio.NewReader(os.stdin)//标准输入
- reader.ReadString('\n')//读到什么字符就结束
- stdout:标准输出
- buffio.NewReader:创建个流,通过reader.ReadByte()按字节读取,返回的值是size,len
- input = strings.TrimSuffix(input, "\r\n") //去除换行符
- 字典:
- 需要两个网站转换,将curl命令转换为go语言Convert curl commands to Go (curlconverter.com)
- 将JSON转Golang StructJSON转Golang Struct - 在线工具 - OKTools
- 创建结构体:type request struct {
Transport stringjson:"trans_type"
Source stringjson:"source"
UserId stringjson:"user_id"
} 注意:json标签要与浏览器中的请求标签一样,不然无法解析 - buf, err := json.Marshal(request),进行序列化,把这个请求序列化为go的byte[]切片
- err = json.Unmarshal(bodyText, &dirRequest),进行反序列化,转换为json的标签
- log.Fatal(err)退出程序,并且返回错误
- socks5代理服务器:
- log.println和fmt.println的区别就是,log还包含了时间戳,但是fmt不包含,具体的可以看:Golang 中 log.Println 与 fmt.Println 的区别 (sunzhongwei.com)
- buf := make([]byte, 4) //先读满前4个字节
-
-
socks5Ver = 0x05
-
- aytpIpv4 = 0x01
- cmdBind = 0x014
- cxt, cancel := context.WithCancel(context.Background()),con text关键字,非常重要
- go func(){}()匿名函数,直接开启个go程,但是消耗比线程小得多,速度非常非常快
- port := binary.BigEndian.Uint16(buf[:2]),大端和小端的转换,网页中的数据默认为大端,如果计算机为小端,就需要进行转换,转换为无符号的16进制数
- return fmt.Errorf("conn write fail", err),应该是返回的错误,进行打印吧
- io.ReadFull(reader, buf),读取reader的数据到buf中,读满