Go基础|青训营笔记

117 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第1天。

就个人体验来说很棒。十分流畅,毫不拖沓。

课堂内容

  • Go基础语法:讲解了关于变量、循环、分支、切片、json序列化与反序列化等基础知识
  • 在线词典:用抓包、将网络请求复制为cURL来生成go代码,用json数据来生成对应结构体
  • socks5代理:通过了解socks5的报文格式,用tcp协议实现了简易且能被识别的socks5代理程序

在线词典

在网页中按F12便可以在网络一项找到请求的链接,在负载一项中可以找到提交的数据,在预览一项中可以看到服务器返回的数据

image.png

将这个链接复制为cURL, 便可以在这个网站Convert curl commands to Go (curlconverter.com)上转换为go的代码

image.png

在复制代码直接运行后,便会得到一个json格式字符串将其解析出来变为结构体。然后输出我们想要的数据即可。可以在JSON转Golang Struct - 在线工具 - OKTools用json格式的数据生成对应的结构体

image.png

socks5代理

socks5协议的流程如下:

客户端和socks5服务器进行协商验证→客户端提供目标地址和端口等信息给socks5服务器,由socks5服务器向目标建立链接→由socks5服务器中转两方发送的数据

image.png

部分核心函数和代码:

// 监听本地端口
server, err := net.Listen("tcp", "127.0.0.1:1080")
// 接受一个客户端的链接
client, err := server.Accept()
// 当一个链接创建起来用defer来修饰,让链接在函数结束的时候自动释放
defer client.Close()
// 用bufio这个流来关系客户端发来的数据
reader := bufio.NewReader(client)
// 从流中读取一个字节
ver, err := reader.ReadByte()
// 从流中读取,把我们准备缓冲填满
method := make([]byte, methodSize)
_, err = io.ReadFull(reader, method)
// 向对端发送数据
_, err = conn.Write([]byte{socks5Ver, 0x00})
// 向目标地址建立tcp链接
dest, err := net.Dial("tcp", fmt.Sprintf("%v:%v", addr, port))
// 从reader死循环不断拷贝数据到的神态,直到链接关闭
_, _ = io.Copy(dest, reader)