这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
一 本堂课的重点内容
- 有关GO的基本语法
- 项目实战
- 跟GO有关的网络编程
- 常用的重要函数
二实践练习 (项目简述)
项目2 在线词典
使用抓包的词典网站为
项目代码的实现流程
- 根据网站抓包和自动化生成的代码平台 得到比较粗糙的请求报文的代码和读取返回报文的代码
- 解析respond body 和 利用相关网站 ,得到了接受报文的结构体(避免手动出错)
- 利用json的序列化
json.Marshal()和反序列化json.Unmarshal分别进行读入和输出
项目3 Socks5代理
基本原理如下图所示
代码实现的流程
回声服务器的实现
最简单的服务器的一个实现,也是接下来更迭的借个版本的雏形,主要的处理函数是func process(conn net.Conn) 在这个函数中添加其他重要的操作
认证过程的实现
在这个版本主要实现了func auth(reader *bufio.Reader, conn net.Conn) (err error)
对应原理中的1 和 1.1的阶段
客户机发送的报文格式为
ver, err := reader.ReadByte() //读取第一个字节
if err != nil {
return fmt.Errorf("read ver failed: %w", err)
}
if ver != socks5Ver {
return fmt.Errorf("not supported ver:%v", ver)
}
methodSize, err := reader.ReadByte() // 读取第二个字节
if err != nil {
return fmt.Errorf("read methodSize failed:%w", err)
}
method := make([]byte, methodSize)
_, err = io.ReadFull(reader, method)
if err != nil {
return fmt.Errorf("read method failed%w", err)
}
log.Println("ver", ver, "method", method)
上一部分就是核心代码 接着填充返回报文 此部分结束
请求连接的建立
处理的基本逻辑跟上一部分的逻辑基本相同 都是接受报文的各个段然后分别进行检验,如果符合要求就向下进行,不符合就直接返回
返回时的报文格式如下
我们只需要按照各个字段的要求进行填充即可
_, err = conn.Write([]byte{0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0})
relay 阶段
这是该项目的最后一个阶段
首先我们需要代理和服务器进行TCP的连接 关键的代码如下
port := binary.BigEndian.Uint16(buf[:2])
dest, err := net.Dial("tcp", fmt.Sprintf("%v:%v", addr, port))
if err != nil {
return fmt.Errorf("dial dst failed:%w", err)
}
defer dest.Close()
log.Println("dial", addr, port)
接着我们就要实现 双向拷贝数据代码如下:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go func() {
_, _ = io.Copy(dest, reader)
cancel()
}()
go func() {
_, _ = io.Copy(conn, dest)
cancel()
}()
<-ctx.Done()
return nil
三 课后个人总结:
首先第一部分讲述了Go的基本语法和常用的数据结构和一些Go特点,这点需要我们多加练习 在第二个实践部分中,使用了Go进行了网络编程,我觉得这是我们平时学习Go有所薄弱的地方,也是我们这次大项目的一次重要铺垫,我觉得其中很多的处理报文的逻辑思路和方法都值得我们牢记并在以后的项目中进行借鉴。 其中遇到的一个小问题就是在实践项目3的实践Windows 10 默认是IPv6优先需要我们进行调整(否者无法进行实验) 参考的连接是 dashen.wang/910.html 将IPv4的优先级调高
四 参考链接
GO语言学习 参鸟教程 www.runoob.com/go/go-tutor…
查看本机IPv6和IPv4的地址和默认优先地址 blog.csdn.net/austin1000/…
解决本机默认优先使用IPv6的方法 dashen.wang/910.html