channelN chan int
channel chan interface{}
wantLog chan bool
- waitclose chan bool
tracef *log.Logger // 记录所有日志
infof *log.Logger // 重要的信息
warningf *log.Logger // 需要注意的信息
func (l *logl) New(fileP string) {
l.wantLog = make(chan bool,2)
- l.waitclose = make(chan bool)
l.channelN = make(chan int,200)
l.channel = make(chan interface{},200)
log.Println("ERROR:",<- l.channel)
}
}
+ for len(l.wantLog) != 0 {<- l.wantLog}
continue
}
os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
l.E("Failed to open log file:", err)
+ for len(l.wantLog) != 0 {<- l.wantLog}
continue
}
if err != nil {
l.E("cannot flock", fileName, err)
file.Close()
+ for len(l.wantLog) != 0 {<- l.wantLog}
continue
}
i := <- l.channelN
switch i {
case -1:
- l.fileName = ""
- l.waitclose <- true
+ l.Close()
case 0:
l.tracef.Println(<- l.channel)
case 1:
file.Close()
- <- l.wantLog
+ for len(l.wantLog) != 0 {<- l.wantLog}
}
}()
}
}
func (l *logl) WClose(){
+ if l.fileName == "" {return}
l.channelN <- -1
- if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true}
- <- l.waitclose
+ if len(l.wantLog) ==0 {l.wantLog <- true;l.wantLog <- true;}
}
func (l *logl) T(i ...interface{}){
"bytes"
"os/exec"
"runtime"
+ "time"
"github.com/miekg/dns"
)
break
}
- targetconn, err := net.Dial(*targetnetwork, *targetaddr)
- if err != nil {
- Logf().E("[part/Forward]Unable to connect:", *targetaddr, err.Error())
- proxyconn.Close()
- continue
+ 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
}
-
- go tcpBridge2(proxyconn,targetconn)
}
}