diff --git a/benckmark.go b/benckmark.go new file mode 100644 index 0000000..bc217db --- /dev/null +++ b/benckmark.go @@ -0,0 +1,73 @@ +package main + +import ( + llog "github.com/TransX/log" + "github.com/davecheney/profile" + "io/ioutil" + "log" + "math/rand" + "net/http" + "sync" + "time" +) + +var mux sync.Mutex +var benchSeed int + +func transClient() { + t := NewTransTCP() + t.Start("1200", "127.0.0.1", "1201", "client") +} + +func transServer() { + t := NewTransTCP() + t.Start("1201", "192.168.56.101", "80", "server") +} + +func doHttp(c chan int) { + resp, err := http.Get("http://127.0.0.1:1200/test.bin") + if err != nil { + log.Println("could not get:", err) + return + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + log.Printf("got %d bytes\n", len(body)) + if err != nil { + log.Println("not get:", err) + } else { + + } + c <- 0 + +} + +func randMillionSecond() time.Duration { + mux.Lock() + benchSeed++ + defer mux.Unlock() + s := rand.NewSource(int64(benchSeed)) + r := rand.New(s) + return time.Duration(r.Int() % 1000) +} + +func attack() { + c := make(chan int) + for i := 0; i < 10; i++ { + time.Sleep(time.Millisecond * randMillionSecond()) + go doHttp(c) + } + for i := 0; i < 10; i++ { + <-c + } + log.Println("Finish") +} + +func main() { + llog.LogTo("applog/log.txt", "DEBUG") + defer profile.Start(profile.CPUProfile).Stop() + benchSeed = 0 + go transClient() + go transServer() + attack() +} diff --git a/main.go b/main.go index 6f33b7f..7c75cf1 100644 --- a/main.go +++ b/main.go @@ -6,6 +6,7 @@ import ( "fmt" "github.com/TransX/cli" "github.com/TransX/log" + "github.com/davecheney/profile" "strconv" ) @@ -22,6 +23,7 @@ func tunnel() { } func main() { + defer profile.Start(profile.CPUProfile).Stop() flag.Parse() fmt.Println("Hello World!") log.LogTo(cli.LogTo, "INFO") diff --git a/main_test.go b/main_test.go index b0197b4..69285a5 100644 --- a/main_test.go +++ b/main_test.go @@ -181,7 +181,7 @@ func clientBin(t *testing.T) { } log.Info("Test Client Receive %s", bytes[:n]) fmt.Println("Test Client Receive ", string(bytes[:n])) - // time.Sleep(time.Second * 2) + time.Sleep(time.Second * 2) conn.Close() log.Info("Test Client closed") @@ -220,7 +220,7 @@ func clientText(t *testing.T) { } func TestTunnel(t *testing.T) { - log.LogTo("log.txt", "DEBUG") + log.LogTo("stdout", "ERROR") log.Info("Test Start testing.") go serverBin(t) go clientBin(t) diff --git a/server.bat b/server.bat index 96aaec8..70ce34d 100644 --- a/server.bat +++ b/server.bat @@ -1 +1 @@ -.\TransX -destip 191.101.11.132 -destport 8321 -listenport 1082 -encrypt server -log applog/server.log \ No newline at end of file +.\TransX -destip 127.0.0.1 -destport 1084 -listenport 1082 -encrypt server -log applog/server.log \ No newline at end of file diff --git a/tscipher/cipher.go b/tscipher/cipher.go index adc3a22..7476126 100644 --- a/tscipher/cipher.go +++ b/tscipher/cipher.go @@ -2,6 +2,7 @@ package tscipher import ( "bytes" + "fmt" "github.com/TransX/log" "github.com/TransX/utils" "io" @@ -82,8 +83,9 @@ func WrapPackage(data []byte) []byte { //把要加密传输的数据打包成一 sizeOfData := len(data) binSize := utils.Int2binary(sizeOfData, 10) header := append(append(StartMark, binSize...), EndMark...) + // log.Error("size of header %d %x", len(header), header) //加密 - key := []byte("hahahehe~-1!") + key := []byte("#2GD+.>dt`Qdp") key = key cipheredHeader := make([]byte, len(header)) for i, v := range header { @@ -96,11 +98,13 @@ func UnwrapPackage(pacakge []byte) (data []byte, rest []byte, err error) { //前14个字节是header cipheredHeader := pacakge[:18] header := make([]byte, len(cipheredHeader)) - key := []byte("hahahehe~-1!") + key := []byte("#2GD+.>dt`Qdp") key = key for i, v := range cipheredHeader { header[i] = v ^ key[i%len(key)] } + // log.Error("receive header %d %x", len(header), header) + // log.Error("receive pacakge %d %x", len(pacakge[:180]), pacakge[:180]) start := header[:4] end := header[14:] binSize := header[4:14] @@ -126,7 +130,7 @@ func UnwrapPackage(pacakge []byte) (data []byte, rest []byte, err error) { b := strings.Index(string(pacakge), "_=1z") err = &NotPackageError{"NotPackageError(contains)" + "start:" + string(start) + " end:" + string(end) + "pacakge " + strconv.Itoa(len(pacakge)) + "start" + strconv.Itoa(a) + "end" + strconv.Itoa(b)} } else { - err = &NotPackageError{"NotPackageError" + "start:" + string(start) + " end:" + string(end)} + err = &NotPackageError{fmt.Sprintf("NotPackageError start: %s end: %s whole %x", string(start), string(end), header)} } } return @@ -164,11 +168,11 @@ func RowReceiveData(carrier *Carrier) (n int, err error) { } func ReceiveData(carrier *Carrier) (n int, err error) { - defer func() { - if r := recover(); r != nil { - log.Error("ReceiveData err %s", r) - } - }() + // defer func() { + // if r := recover(); r != nil { + // log.Error("ReceiveData err %s", r) + // } + // }() log.Info("id %s wrapedPackage := carrier.GetReceiveBuff()", carrier.AttachedTunnelID) wrapedPackage := carrier.GetReceiveBuff() //make([]byte, 0, cap(carrier.Cache)) var packageData []byte @@ -178,7 +182,8 @@ func ReceiveData(carrier *Carrier) (n int, err error) { data, rest, err := UnwrapPackage(wrapedPackage) packageData = data _rest = rest - if err, ok := err.(*NotPackageError); len(wrapedPackage) > 0 && ok { + if err, ok := err.(*NotPackageError); len(wrapedPackage) >= 18 && ok { + log.Debug("return NotPackageError %s", carrier.AttachedTunnelID) return 0, err } log.Debug("id %s length of package %d", carrier.AttachedTunnelID, len(packageData)) diff --git a/tunnel.go b/tunnel.go index 40eedc0..c45fbe1 100644 --- a/tunnel.go +++ b/tunnel.go @@ -83,7 +83,7 @@ func (this *Tunnel) run() { //单向的,从src发送到dest if err != nil { log.Panic("Write panic. ID: %s, Err: %s, Remote Add: %s", id, err, dest.RemoteAddr().String()) } - log.Info("Write %d bytes from %s to %s. Tunnel: %s . 18 bytes", n, dest.LocalAddr(), dest.RemoteAddr().String(), id, string(sendCarrier.Cache[:18])) + log.Info("Write %d bytes from %s to %s. Tunnel: %s . 18 bytes %x", n, dest.LocalAddr(), dest.RemoteAddr().String(), id, sendCarrier.Cache[:18]) } }