go - 代理处理函数中 []byte 的字符串表示
问题描述
我正在使用 构建 TCP 代理go
,但我遇到了一个小问题。在实际处理连接c1
并将其转发到之前c2
,我想做一些检查。为此,我需要来自c1
. 不幸的是,在作者和读者之间直接_, 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
}()
推荐阅读
- java - 无法处理动态 {} org.apache.camel.FailedToCreateRouteException:无法创建路由
- c# - 锁定 ConcurrentDictionary 又名如何实现条件非阻塞锁时,c# 锁的语法糖是什么?
- html - 如何将多个按钮居中在其他按钮的右上角
- python - os.remove - [WinError 32] 进程无法访问该文件,因为它正被另一个进程使用
- android - 在我的 Android 应用程序 (java) 中,我想在将我的 Android 与 USB 连接连接到另一台设备时检索 IP 地址
- flutter - Flutter webview文本输入被软键盘隐藏
- time - 更改日线图关闭时间设置
- amazon-web-services - 跨账户 Amazon 标准 SQS 队列时出现 AccessDeniedException
- php - Laravel 下载响应不强制文件下载
- c++ - 我的代码有什么问题[Dfs,动态编程]