我正在尝试制作一个TCP代理/路由器,我需要拦截一些请求数据以便与路由规则进行模式匹配。
但是我对Golang有点陌生。现在,端口转发可以了,但是当我尝试读取传入的请求时,无法将传入的数据重播到远程端口。
注释的块是它失败的地方。
package main
import (
"fmt"
"io"
"net"
"os"
)
func main() {
fmt.Println(os.Args)
if len(os.Args) != 4 {
fmt.Println("prog listen_port remote_host, remote_port")
os.Exit(3)
}
listen_port := os.Args[1]
rmt_host := os.Args[2]
rmt_port := os.Args[3]
fmt.Println("localhost:" + listen_port + " -> " + rmt_host+":"+rmt_port)
ln, err := net.Listen("tcp", ":"+listen_port)
if err != nil {
panic(err)
}
for {
conn, err := ln.Accept()
if err != nil {
panic(err)
}
go handleRequest(conn, rmt_host, rmt_port)
}
}
func handleRequest(conn net.Conn, rmt_host string, rmt_port string) {
proxy, err := net.Dial("tcp", rmt_host+":"+rmt_port)
if err != nil {
panic(err)
}
/* //enable this part = fails, able to read the request, but not replay it.
buffer := make([]byte, 60000)
conn.Read(buffer)
s := string(buffer)
fmt.Println(s)
*/
go copyIO(conn, proxy)
go copyIO(proxy, conn)
}
func copyIO(src, dest net.Conn) {
defer src.Close()
defer dest.Close()
io.Copy(src, dest)
}
有人可以给我指明方向吗?