From e7bdc58c97c2f485adfd01732337f8a5402554a2 Mon Sep 17 00:00:00 2001 From: "dmy@lab" Date: Sat, 10 Oct 2015 18:28:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=99=E6=AF=8F=E4=B8=AAtunnel=E5=8A=A0ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dmy@lab --- main.go | 6 ++++++ tcp.go | 36 ++++++++++++++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/main.go b/main.go index 1ab39fd..271b75b 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,12 @@ import ( "fmt" ) +func Tunnel() { + trans := NewTransTCP() + trans.Start("1200", "127.0.0.1", "8118") +} + func main() { fmt.Println("Hello World!") + Tunnel() } diff --git a/tcp.go b/tcp.go index 749f759..b4ed3a9 100644 --- a/tcp.go +++ b/tcp.go @@ -1,20 +1,26 @@ package main import ( + "bytes" + "crypto/md5" + "encoding/hex" "github.com/TransX/tscipher" - // "io" "log" "net" + "strconv" + "sync/atomic" + "time" ) type TransTCP struct { - // serverConn *net.Conn - // clientConn net.Conn - // cache []byte + seed int32 } func NewTransTCP() *TransTCP { - return &TransTCP{} + + return &TransTCP{ + 0, + } } func (this *TransTCP) createTCPClient(ip, port string) (conn net.Conn, err error) { @@ -40,7 +46,7 @@ func (this *TransTCP) createTCPListener(ip, port string) (listen net.Listener, e return } -func (this *TransTCP) tunnel(src, dest net.Conn) { +func (this *TransTCP) tunnel(src, dest net.Conn, id string) { defer func() { if r := recover(); r != nil { if src != nil { @@ -62,9 +68,9 @@ func (this *TransTCP) tunnel(src, dest net.Conn) { } nByte, err := tscipher.ReceiveData(revCarrier) if err != nil { - log.Panicln("Read panic", err, src.RemoteAddr().String()) + log.Panicln("Read panic", id, err, src.RemoteAddr().String()) } - log.Println("Reived ", string(cache[:nByte])) + log.Println("Reived ", id, string(cache[:nByte])) sendCarrier := &tscipher.Carrier{ dest, tscipher.NewCipher("default"), @@ -73,12 +79,19 @@ func (this *TransTCP) tunnel(src, dest net.Conn) { _, err = tscipher.SendData(sendCarrier, nByte) log.Println("Write") if err != nil { - log.Panicln("Write panic", err, dest.RemoteAddr().String()) + log.Panicln("Write panic", id, err, dest.RemoteAddr().String()) } } } +func (this *TransTCP) tunnelID() string { + nowString := time.Now().String() + strconv.Itoa(int(this.seed)) + atomic.AddInt32(&this.seed, 1) //避免多线程情况下获得的种子相同 + md5Byte := md5.Sum(bytes.NewBufferString(nowString).Bytes()) + return hex.EncodeToString(md5Byte[:]) +} + func (this *TransTCP) Start(listenPort, destIP, destPort string) { listener, err := this.createTCPListener("0.0.0.0", listenPort) @@ -94,11 +107,10 @@ func (this *TransTCP) Start(listenPort, destIP, destPort string) { log.Fatalln("Failed to connect to destination.", err) } log.Println("Dial", destConn.RemoteAddr().String()) - go this.tunnel(listenerConn, destConn) - go this.tunnel(destConn, listenerConn) + go this.tunnel(listenerConn, destConn, this.tunnelID()) + go this.tunnel(destConn, listenerConn, this.tunnelID()) } else { log.Println("Failed to accept incoming connection.", err) - } } }