代理数据包时如何匹配请求响应?

时间:2016-08-20 14:08:39

标签: mysql networking go tcp proxy

我正在使用基于浏览器的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或类似的

0 个答案:

没有答案