我想知道,是否可以通过 websockets 协议传输/隧道 TCP 连接?有一个websockets 包,似乎我可以将 TCP 连接 io.copy 到 websockets 连接中,但我不知道如何在另一端将其重新组装为 TCPConn。例如,我想在一端创建一个 socks5 ServerN(在 NAT 后面),在另一端创建一个 ServerIE。互联网用户会向 ServerIE 发出socks5 请求(通过socks5 协议),ServerIE 会通过websocket 连接将socks5 请求发送到ServerNAT。ServerNAT 然后将处理socks5 请求(即它是socks5 服务器)。编辑: 我写了一些代码,但不幸的是它在从 TCP 连接读取到 WS 时卡住了。运行它:go run main.go -logtostderrpackage mainimport ( "flag" log "github.com/golang/glog" "golang.org/x/net/websocket" "bufio" "net" "net/http" "time"// "io")func main() { flag.Parse() defer log.Flush() log.Infof("wsServer()") wsCh := wsServer() log.Infof("wsNAT()") natWS, err := wsNAT() if err != nil { log.Error(err) return } done := make(chan struct{}, 1) log.Infof("listenTCP()") conn := listenTCP() buf := bufio.NewReader(conn) go func() { log.Infof("Write TCP to WS") n, err := buf.WriteTo(natWS) if err != nil { log.Fatal(err) return } log.Infof("newConn.ws.ReadFrom(conn) %v", n) close(done) }() wsToTCP(<- wsCh) <-done}// wsNAT dials /ws endpoint and returns a websocket connection.func wsNAT() (*websocket.Conn, error) { time.Sleep(1 * time.Second) origin := "http://localhost/" url := "ws://localhost:12345/ws" return websocket.Dial(url, "", origin)} // wsServer returns the websocket // connections received on /ws endpointfunc wsServer() chan *websocket.Conn { wsCh := make(chan *websocket.Conn, 1) http.Handle("/ws", websocket.Handler(func(ws *websocket.Conn) { wsCh <- ws time.Sleep(1 *time.Hour) })) go func() { err := http.ListenAndServe(":12345", nil) if err != nil { panic("ListenAndServe: " + err.Error()) } }() return wsCh}要触发 TCP 侦听器,您可以在端口 8080 上发出请求(例如curl --socks5 localhost:8080 google.com -v或curl localhost:8080 -v)
1 回答
- 1 回答
- 0 关注
- 171 浏览
添加回答
举报
0/150
提交
取消