func NewClientMgr(d5c *t.D5ClientConf) *clientMgr { d5pArray := d5c.D5PList dhKeys := t.GenerateDHKeyPairs() num := len(d5pArray) var chain []byte if num > 1 { chain = make([]byte, 2*num) for i, _ := range chain { chain[i] = byte(i % num) } } mgr := &clientMgr{ dhKeys, d5pArray, make([]*t.Client, num), num, chain, } for i := 0; i < num; i++ { c := t.NewClient(d5pArray[i], dhKeys) mgr.clients[i] = c go c.StartTun(true) } return mgr }
func (context *bootContext) startClient() { defer func() { ex.CatchException(advice(recover())) sigChan <- t.Bye }() conf, err := t.Parse_d5c_file(context.config) if err != nil { log.Fatalln(advice(err)) } context.setLogVerbose(conf.Verbose) log.Infoln(versionString()) log.Infoln("Socks5/Http is working at", conf.ListenAddr) ln, err := net.ListenTCP("tcp", conf.ListenAddr) if err != nil { log.Fatalln(err) } defer ln.Close() dhKey, _ := c.NewDHKey(DH_METHOD) client := t.NewClient(conf, dhKey) context.components = append(context.components, client) context.closeable = append(context.closeable, ln) go client.StartTun(true) for { conn, err := ln.Accept() if err == nil { if client.IsReady() { go client.ClientServe(conn) continue } else { log.Errorf("No available tunnels for servicing new request") time.Sleep(time.Second) } } t.SafeClose(conn) } }