代码之家  ›  专栏  ›  技术社区  ›  ChaChaPoly

代理处理程序函数中[]字节的字符串表示形式

  •  2
  • ChaChaPoly  · 技术社区  · 8 年前

    go ,但我面临一个小问题。在实际处理连接之前 c1 并转发给 c2 ,我想做一些检查。为此,我需要 c1类 _, err := io.CopyBuffer(w, r, buf) 正在复制 []byte 直接在作者和读者之间,如果我这样做了 c1.Read() cp []字节 已经读过了。

     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)
            }
        }
    

    这样我就可以用副本显示为一个字符串?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Peter saif iqbal    8 年前

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

    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)
    }
    

    或者,只需在开始复制之前写入()字节:

        go func() {
            // Replay contents of buf
            _, err := c2.Write(buf)
            if err != nil {
                errc <- err
                return
            }
    
            _, err = io.Copy(c2, c1)
            errc <- err
        }()
    
    推荐文章