Golang实现一个简单的TCP端口转发程序(TCP反向代理)

代码10 次浏览

利用Golang强大的net库,可以轻松实现一个简单的TCP端口转发程序(TCP反向代理)。

package main

import (
	"fmt"
	"io"
	"net"
)

var (
	serverAddr = "127.0.0.1:80"    // 目标服务器地址
	proxyAddr  = ":8081"           // 本地代理监听地址
)

func main() {
	go ListenRemoteClient()
	shutdown := make(chan struct{})
	<-shutdown
}

func ListenRemoteClient() {
	ln, err := net.Listen("tcp", proxyAddr)
	if err != nil {
		fmt.Println("本地监听端口时异常", err)
	}
	for {
		clientConn, err := ln.Accept()
		if err != nil {
			fmt.Println("建立与客户端连接时异常", err)
			return
		}
		go connectPipe(clientConn)
	}
}

func connectPipe(clientConn net.Conn) {
	serverConn, err := net.Dial("tcp", serverAddr)
	if err != nil {
		fmt.Println("建立与服务端连接时异常", err)
		_ = clientConn.Close()
		return
	}
	pipe(clientConn, serverConn)
}

func pipe(src net.Conn, dest net.Conn) {
	errChan := make(chan error, 1)
	onClose := func(err error) {
		_ = dest.Close()
		_ = src.Close()
	}
	go func() {
		_, err := io.Copy(src, dest)
		errChan <- err
		onClose(err)
	}()
	go func() {
		_, err := io.Copy(dest, src)
		errChan <- err
		onClose(err)
	}()
	<-errChan
}

参考资料

相关文章

评论

暂无评论

发表评论

提交后需审核,请勿重复提交。