go - 代理处理函数中 []byte 的字符串表示形式

标签 go tcp proxy

我正在使用 go 构建 TCP 代理,但我遇到了一个小问题。在实际处理连接 c1 并将其转发到 c2 之前,我想做一些检查。为此,我需要 c1 中字节 slice 的字符串表示形式。不幸的是, _, err := io.CopyBuffer(w, r, buf) 正在直接在写入器和读取器之间复制 []byte ,如果我这样做 c1.Read()cp 函数之前,[]byte 已经被读取。

这是包含连接处理的函数:

 func (p *proxy) handle(c1 net.Conn) {
        p.log.Printf("accepted %v", c1.RemoteAddr())
        defer p.log.Printf("disconnected %v", c1.RemoteAddr())
        defer c1.Close()
        c2, err := dialer.Dial("tcp", p.dial)
        log.Println("DIAL:", p.dial)
        if err != nil {
            p.log.Print("C2", err)
            return
        }
        defer c2.Close()

        errc := make(chan error, 2)
        cp := func(w io.Writer, r io.Reader) {
            buf := bufferPool.Get().([]byte)
            _, err := io.CopyBuffer(w, r, buf)
            errc <- err
            bufferPool.Put(buf)
        }
        go cp(struct{ io.Writer }{c1}, c2)
        go cp(c2, struct{ io.Reader }{c1})
        err = <-errc
        if err != nil {
            p.log.Print("F-ERROR ->", err)
        }
    }

有没有办法“复制”[]byte,以便我可以使用副本显示为字符串?

最佳答案

您可以使用io.MultiReader连接两个或更多读者。因此,您可以从 c1 读取(),然后使用 MultiReader“重播”您已读取的字节。

package main

import (
    "bytes"
    "io"
    "log"
    "net"
)

func main() {
    var c1, c2 net.Conn

    buf := make([]byte, 64)
    n, err := c1.Read(buf)
    buf = buf[:n]
    if err != nil {
        log.Fatal(err)
    }

    // TODO: deal with string(buf)

    errc := make(chan error, 2)

    go func() {
        // Replay contents of buf, then copy the unread part of c1.
        _, err := io.Copy(c2, io.MultiReader(bytes.NewReader(buf), c1))
        errc <- err
    }()

    go func() {
        _, err := io.Copy(c1, c2)
        errc <- err
    }()

    err = <-errc
    log.Println(err)
}

或者,在开始复制之前简单地 Write() 字节:

    go func() {
        // Replay contents of buf
        _, err := c2.Write(buf)
        if err != nil {
            errc <- err
            return
        }

        _, err = io.Copy(c2, c1)
        errc <- err
    }()

关于go - 代理处理函数中 []byte 的字符串表示形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52368603/

相关文章:

java - 跨平台和跨语言的客户端/服务器应用程序连接

python - 使用自定义证书文件在代理后面进行 Pip

c - 在 c 中设置客户端连接的端口范围

java - spring - 为@Autowired 字段强制使用 cglib 代理

c - 为什么我用cgo的时候报错 "undefined reference to ` add2”

c - 在 Linux 中找到进程组的 session 领导者或控制 TTY 的方法有哪些?

go - http.Response.Body 复制导致大量内存使用增加

mongodb - 我如何将 bson.M 元素列表组合成单个 bson.M 在 golang 的 mongo 中?

c++ - QNetworkAccessManager,重置 TCP 连接

SSL 编程接口(interface)