golang 实现tcp转发代理的方法
作者:JieLinDee 时间:2023-08-06 02:46:55
我就废话不多说了,直接上代码吧:
package main
import (
"flag"
"fmt"
"io"
"net"
"os"
"strings"
"sync"
)
var lock sync.Mutex
var trueList []string
var ip string
var list string
func main() {
flag.StringVar(&ip, "l", ":9897", "-l=0.0.0.0:9897 指定服务监听的端口")
flag.StringVar(&list, "d", "127.0.0.1:1789,127.0.0.1:1788", "-d=127.0.0.1:1789,127.0.0.1:1788 指定后端的IP和端口,多个用','隔开")
flag.Parse()
trueList = strings.Split(list, ",")
if len(trueList) <= 0 {
fmt.Println("后端IP和端口不能空,或者无效")
os.Exit(1)
}
server()
}
func server() {
lis, err := net.Listen("tcp", ip)
if err != nil {
fmt.Println(err)
return
}
defer lis.Close()
for {
conn, err := lis.Accept()
if err != nil {
fmt.Println("建立连接错误:%v\n", err)
continue
}
fmt.Println(conn.RemoteAddr(), conn.LocalAddr())
go handle(conn)
}
}
func handle(sconn net.Conn) {
defer sconn.Close()
ip, ok := getIP()
if !ok {
return
}
dconn, err := net.Dial("tcp", ip)
if err != nil {
fmt.Printf("连接%v失败:%v\n", ip, err)
return
}
ExitChan := make(chan bool, 1)
go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
_, err := io.Copy(dconn, sconn)
fmt.Printf("往%v发送数据失败:%v\n", ip, err)
ExitChan <- true
}(sconn, dconn, ExitChan)
go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
_, err := io.Copy(sconn, dconn)
fmt.Printf("从%v接收数据失败:%v\n", ip, err)
ExitChan <- true
}(sconn, dconn, ExitChan)
<-ExitChan
dconn.Close()
}
func getIP() (string, bool) {
lock.Lock()
defer lock.Unlock()
if len(trueList) < 1 {
return "", false
}
ip := trueList[0]
trueList = append(trueList[1:], ip)
return ip, true
}
来源:https://blog.csdn.net/fyxichen/article/details/51505542
标签:golang,tcp,转发代理
0
投稿
猜你喜欢
基于Go语言实现插入排序算法及优化
2024-05-22 10:18:05
python中Requests请求的安装与常见用法
2022-08-15 20:36:35
Asp中Scripting.TextStream 对象介绍
2007-11-02 12:19:00
asp连接access数据库表代码实例
2008-04-13 06:18:00
Flask框架Flask-Login用法分析
2022-05-20 08:21:27
利用Django模版生成树状结构实例代码
2023-11-10 16:41:11
Python实现井字棋小游戏
2023-04-27 05:29:07
python 初始化一个定长的数组实例
2022-12-27 18:59:36
python中isdigit() isalpha()用于判断字符串的类型问题
2023-05-02 18:52:48
ASP模拟MVC模型的编程方式
2008-10-15 14:51:00
javascript仿qq界面的折叠菜单实现代码
2024-06-12 17:12:49
python特效之字符成像详解
2021-06-07 02:18:45
python监控文件或目录变化
2023-09-05 16:08:28
Python Web服务器Tornado使用小结
2023-06-25 23:07:21
asp如何读取Windows的信息文件(.ini)?
2009-11-20 18:27:00
内容,而不是Chrome
2008-10-16 13:43:00
用Python可视化新冠疫情数据
2021-10-14 06:06:39
PyQt实现界面翻转切换效果
2023-12-27 04:49:46
tensorflow 恢复指定层与不同层指定不同学习率的方法
2023-08-27 23:09:14
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2023-05-22 22:46:00