我正在使用基于浏览器的GUI处理MySQL代理。 应用程序的核心如下:
//Trying to connect to server
rightConn, err := net.Dial("tcp", l.rightAddr)
if err != nil {
return
}
defer rightConn.Close()
wg.Add(2)
//Start passing packets from client to server
go func() {
defer wg.Done()
l.Pipe(leftConn, rightConn)
}()
//Start passing packets from server to client
go func() {
defer wg.Done()
l.Pipe(rightConn, leftConn)
}()
wg.Wait()
这里是Pipe的定义:
func (l *Lottip) Pipe(right, left net.Conn) {
for {
pkt, err := mysql.ReadPacket(right)
if err != nil {
break
}
if _, err = mysql.WritePacket(pkt, left); err != nil {
break
}
}
}
我使用自定义代理功能而不是
的原因go io.Copy(left, right)
go io.Copy(right, left)
我必须解析每个MySQL的请求/响应数据包并准备好进行进一步处理。
众所周知,MySQL客户端可以发送大量查询并以随机顺序获取响应。
问题是我无法获得如何将请求与其响应相匹配。虽然我使用2个goroutines(每个方向1个)管道,但我可以轻松读取服务器响应,但我不知道它的响应请求。
我通过Wireshark检查了MySQL客户端和服务器之间的请求/响应,发现没有提及packet_id或query_id或类似的