初学golang,写了一个端口转发工具。其实就是lcx中的tran功能。

使用场景 A  ===》 B   A能访问B
               B ===》C    B能访问C

但是   A C  不通。

这样就可以在B上执行lcx_go.exe  0.0.0.0:1987  B的IP:3389

这时候只要 mstsc A的IP:1987 就可以连上B的RDP了。

目前只写了这一个小功能。

主要是学习一下go的语法。

Go的性能接近C++,但是大小是一个缺陷。所以最后我用UPX压缩了一下。还是好大。

代码如下。之后再把剩下的slave和listen功能补充上。

[code]package main

import (
        "fmt"
        "io"
        "net"
        "sync"
        "os"
)

var lock sync.Mutex
var trueList []string
var ip string

var list string

func main() {
        if len(os.Args) != 3 {
                fmt.Fprintf(os.Stderr, "Usage: %s 0.0.0.0:8888 ip:3389\n", os.Args[0])
                os.Exit(1)
        }
        ip = os.Args[1]
        rip := os.Args[2]
        server(rip)
}

func server(rip string) {
        fmt.Printf("Listening %s\n", ip)
        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("Connecting from " ,conn.RemoteAddr())
                go handle(conn, rip)
        }
}

func handle(sconn net.Conn,rip string) {
        defer sconn.Close()
        dconn, err := net.Dial("tcp", rip)
        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) {
                io.Copy(dconn, sconn)
                ExitChan <- true
        }(sconn, dconn, ExitChan)

        go func(sconn net.Conn, dconn net.Conn, Exit chan bool) {
                io.Copy(sconn, dconn)
                ExitChan <- true
        }(sconn, dconn, ExitChan)
        <-ExitChan
        dconn.Close()
}[/code]