func get(connid int, uri, serverAddr string, rawAddr []byte, cipher *ss.Cipher, done chan []time.Duration) { reqDone := 0 reqTime := make([]time.Duration, config.nreq) defer func() { done <- reqTime[:reqDone] }() tr := &http.Transport{ Dial: func(_, _ string) (net.Conn, error) { return ss.DialWithRawAddr(rawAddr, serverAddr, cipher.Copy()) }, } buf := make([]byte, 8192) client := &http.Client{Transport: tr} for ; reqDone < config.nreq; reqDone++ { start := time.Now() if err := doOneRequest(client, uri, buf); err != nil { return } reqTime[reqDone] = time.Now().Sub(start) if (reqDone+1)%1000 == 0 { fmt.Printf("conn %d finished %d get requests\n", connid, reqDone+1) } } }
func connectToServer(serverId int, rawaddr []byte, addr string) (remote *ss.Conn, err error) { se := servers.srvCipher[serverId] remote, err = ss.DialWithRawAddr(rawaddr, se.server, se.cipher.Copy()) if err != nil { log.Println("error connecting to shadowsocks server:", err) const maxFailCnt = 30 if servers.failCnt[serverId] < maxFailCnt { servers.failCnt[serverId]++ } return nil, err } debug.Printf("connected to %s via %s\n", addr, se.server) servers.failCnt[serverId] = 0 return }