gpt4 book ai didi

go - 如何使用过滤器进行websocket portforward或在golang中保存(以数组形式)转发的数据包?

转载 作者:行者123 更新时间:2023-12-01 22:09:21 27 4
gpt4 key购买 nike

我在github上找到了准备好的源代码,用于golang中的portforwarding

这是代码

package main

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

var localServerHost = "localhost:1020"
var remoteServerHost = "192.168.10.1:1020"

func main() {

ln, err := net.Listen("tcp", localServerHost)
if err != nil {
log.Fatal(err)
}

log.Println("Port forwarding server up and listening on ",
localServerHost)

for {
conn, err := ln.Accept()
if err != nil {
log.Fatal(err)
}

go handleConnection(conn)
}
}

func forward(src, dest net.Conn) {
defer src.Close()
defer dest.Close()
io.Copy(src, dest)
}

func handleConnection(c net.Conn) {

log.Println("Connection from : ", c.RemoteAddr())

remote, err := net.Dial("tcp", remoteServerHost)
if err != nil {
log.Fatal(err)
}

log.Println("Connected to ", remoteServerHost)
go forward(c, remote)
go forward(remote, c)
}

我现在不知道如何在用户连接上放置标志,因此我可以从用户连接中读取数据并根据连接标志保存或过滤某些数据包

这是错误的方式吗?

最佳答案

编辑:这是有关转发和过滤TCP的原始答案。此后,@ ermya更改了询问WebSockets的问题。这个答案与现在已经非常不同的问题无关。

您可以通过在io.Copy操作中插入读取器或写入器来过滤流。设置阅读器的方法如下:

type myFilter struct {
r io.Reader
}

func (f myFilter) Read(p []byte) (int, error) {
n, err := f.r.Read(p)

// Do something with p[:n]. As an example, the following for loop shows how
// to uppercase ASCII letters. Replace this for loop with the filtering of
// your choice.
for i, b := range p[:n] {
if 'a' <= b && b <= 'z' {
p[i] = b - ('a' - 'A')
}
}

return n, err
}

通过将对 go forward(remote, c)的调用替换为:从net.Conn过滤数据:
go func() {
defer remote.Close()
defer c.Close()
io.Copy(remote, myFilter{c}) // interpose the filter here
}()

顺便说一句, forward的命名令人困惑,因为 src实际上是目的地,而 dest是源。用这个:
func forward(dest, src net.Conn) {
defer src.Close()
defer dest.Close()
io.Copy(dest, src)
}

关于go - 如何使用过滤器进行websocket portforward或在golang中保存(以数组形式)转发的数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830341/

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