golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法
我就廢話不多說(shuō)了,直接上代碼吧:
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 指定服務(wù)監(jiān)聽的端口")
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和端口,多個(gè)用','隔開")
flag.Parse()
trueList = strings.Split(list, ",")
if len(trueList) <= 0 {
fmt.Println("后端IP和端口不能空,或者無(wú)效")
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("建立連接錯(cuò)誤:%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發(fā)送數(shù)據(jù)失敗:%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接收數(shù)據(jù)失敗:%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
}
以上這篇golang 實(shí)現(xiàn)tcp轉(zhuǎn)發(fā)代理的方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- golang之tcp自動(dòng)重連實(shí)現(xiàn)方法
- 利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解
- Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊
- golang中net的tcp服務(wù)使用
- Golang通過(guò)包長(zhǎng)協(xié)議處理TCP粘包的問(wèn)題解決
- Golang?編寫Tcp服務(wù)器的解決方案
- golang實(shí)現(xiàn)簡(jiǎn)單的tcp數(shù)據(jù)傳輸
- Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究
- Golang TCP網(wǎng)絡(luò)編程的具體實(shí)現(xiàn)
相關(guān)文章
golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換
本文主要介紹了golang時(shí)間及時(shí)間戳的獲取轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
總結(jié)Go語(yǔ)言中defer的使用和注意要點(diǎn)
Go語(yǔ)言中的defer關(guān)鍵字實(shí)現(xiàn)比較特殊的功能,這篇文章給大家總結(jié)了關(guān)于Go語(yǔ)言中defer的使用和注意要點(diǎn),有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-09-09
Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比
這篇文章主要介紹了Golang 獲取文件md5校驗(yàn)的方法以及效率對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
golang實(shí)現(xiàn)PHP數(shù)組特性的方法
我們做業(yè)務(wù)過(guò)程中,對(duì)應(yīng)強(qiáng)類型語(yǔ)言使用有個(gè)痛點(diǎn),就是使用變量之前一定要定義變量類型,那么本文就來(lái)介紹一下golang實(shí)現(xiàn)PHP數(shù)組特性的方法2021-12-12
go local history本地歷史恢復(fù)代碼神器
這篇文章主要為大家介紹了go local history本地歷史恢復(fù)代碼神器的使用功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)實(shí)例
golang語(yǔ)言本身就是c的工具集,開發(fā)c的程序用到的大部分結(jié)構(gòu)體,內(nèi)存管理,攜程等,golang基本都有,下面這篇文章主要給大家介紹了關(guān)于Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下2022-09-09
golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口的示例代碼
滑動(dòng)時(shí)間窗口就是把一段時(shí)間片分為多個(gè)樣本窗口,可以通過(guò)更細(xì)粒度對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),這篇文章主要介紹了golang 實(shí)現(xiàn)時(shí)間滑動(dòng)窗口,需要的朋友可以參考下2022-10-10
Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理
這篇文章主要為大家介紹了Go實(shí)現(xiàn)自己的網(wǎng)絡(luò)流量解析和行為檢測(cè)引擎原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11

