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
  • asp之家 网络编程 m.aspxhome.com