gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 01:38:01 26 4
gpt4 key购买 nike

我正在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com