import (
"net"
"sync"
+ "strings"
"errors"
"bytes"
+ "net/url"
"os/exec"
"runtime"
"time"
return true
}
-// func (t *netl) Forward(targetaddr,targetnetwork *string, listenaddr string,Need_Accept bool) {
-// proxylistener, err := net.Listen("tcp", listenaddr + ":0")
-// if err != nil {
-// Logf().E("[part/Forward]Unable to listen, error:", err.Error())
-// }
-// const max = 1000
-// var accept_chan chan bool = make(chan bool,max)
-// t.RV = append(t.RV,proxylistener.Addr().(*net.TCPAddr).Port,accept_chan,err)
-
-// defer proxylistener.Close()
-
-// tcpBridge2 := func (a, b net.Conn) {
-
-// fin:=make(chan bool,1)
-// var wg sync.WaitGroup
-
-// wg.Add(2)
-// go func(){
-// defer func() {
-// a.Close()
-// b.Close()
-// fin <- true
-// wg.Done()
-// }()
-
-// buf := make([]byte, 20480)
-
-// for {
-// select {
-// case <-fin:
-// return;
-// default:
-// n, err := a.Read(buf)
-
-// if err != nil {return}
-// b.Write(buf[:n])
-// }
-// }
-// }()
-
-// go func(){
-// defer func() {
-// a.Close()
-// b.Close()
-// fin <- true
-// wg.Done()
-// }()
-
-// buf := make([]byte, 20480)
-
-// for {
-// select {
-// case <-fin:
-// return;
-// default:
-// n, err := b.Read(buf)
-
-// if err != nil {return}
-// a.Write(buf[:n])
-// }
-// }
-// }()
-
-// wg.Wait()
-// }
-
-// for {
-
-// proxyconn, err := proxylistener.Accept()
-// if err != nil {
-// Logf().E("[part/Forward]Unable to accept a request:", err.Error())
-// continue
-// }
-
-// if Need_Accept {
-// if len(accept_chan) == max {
-// Logf().E("[part/Forward] accept channel full.Skip")
-// <- accept_chan
-// }
-// accept_chan <- true
-// }
-// if *targetaddr == "" || *targetnetwork == "" {
-// proxyconn.Close()
-// Logf().I("[part/Forward]Stop!", *targetaddr, *targetnetwork)
-// break
-// }
-
-// retry := 0
-// for {
-// targetconn, err := net.Dial(*targetnetwork, *targetaddr)
-// if err != nil {
-// Logf().E("[part/Forward]Unable to connect:", *targetaddr, err.Error())
-// retry += 1
-// if retry >= 2 {proxyconn.Close();break}
-// time.Sleep(time.Duration(1)*time.Millisecond)
-// continue
-// }
-
-// go tcpBridge2(proxyconn,targetconn)
-// break
-// }
-// }
-
-// }
-
const (
ErrorMsg = iota
AcceptMsg
Msg interface{}
}
-func Forward(targetaddr,targetnetwork *string, listenaddr string) (close func(),msg_chan chan ForwardMsg) {
+func Forward(targetaddr,targetnetwork *string, listenaddr string) (closef func(),msg_chan chan ForwardMsg) {
//初始化消息通道
msg_chan = make(chan ForwardMsg, 1000)
}
//初始化关闭方法
- close = func(){
+ closef = func(){
*targetaddr, *targetnetwork = "", ""
listener.Close()
}
go tcpBridge2(proxyconn,targetconn)
}
}(listener, targetaddr, targetnetwork, msg_chan)
+
+ return
}
return errors.New("1")
}
-func MasterDomain(url string) (string,error){
- if u,e := url.Parse(url);e != nil {
+func MasterDomain(url_s string) (string,error){
+ if u,e := url.Parse(url_s);e != nil {
return "",e
} else {
host := u.Hostname()
list := strings.SplitAfter(host, ".")
- if len(list) < 2 {return "",errors.new("invalid domain:"+host)}
+ if len(list) < 2 {return "",errors.New("invalid domain:"+host)}
return strings.Join(list[len(list)-2:], "."),nil
}
return "",nil