我正在制作一個 _golang git bruteforcer。它的行為有點奇怪,我想這與并發有關。?sync.WaitGroup這是代碼:package mainimport { <snipped for brevity> }// ReadFile : Reads File and returns it's contentsfunc ReadFile(fileName string) []string { <snipped for brevity> }func joinString(strs ...string) string { <snipped for brevity> }// MakeRequest : Makes requests concurrentlyfunc MakeRequest(client *http.Client, url string, useragent string, ch chan<- string, wg *sync.WaitGroup) {? ? defer wg.Done()? ? // start := time.Now()? ? request, err := http.NewRequest("GET", url, nil)? ? if err != nil {? ? ? ? fmt.Println(err)? ? ? ? return? ? }? ? request.Header.Set("User-Agent", useragent)? ? response, err := client.Do(request)? ? if err != nil {? ? ? ? return? ? }? ? // secs := time.Since(start).Seconds()? ? if response.StatusCode < 400 {? ? ? ? // fmt.Printf("Time elapsed %f", secs)? ? ? ? bodyBytes, err := ioutil.ReadAll(response.Body)? ? ? ? if err != nil {? ? ? ? ? ? log.Fatal(err)? ? ? ? }? ? ? ? defer response.Body.Close()? ? ? ? bodyString := string(bodyBytes)? ? ? ? notGit, err := regexp.MatchString("<html>", strings.ToLower(bodyString))? ? ? ? if !notGit && len(bodyString) > 0 { // empty pages and html pages shouldn't be included? ? ? ? ? ? fmt.Println(bodyString)? ? ? ? ? ? ch <- fmt.Sprintf(" %s ", Green(url))? ? ? ? }? ? }}在職的 :它從文件中讀取 url 并/.git, /.git/HEAD, /.git/description, /.git/index在網絡服務器上進行檢查。問題:?如果我將http.Client超時更改為2 seconds它將在 2 秒內完成,如果是 50 秒它將等到 50 秒,輸入文件是否包含 10 個 url 或 500 個 url 并不重要。我的理解是,如果有更多的 url,它將等到 goroutine 傳遞的最后一個 URL 超時。
1 回答

達令說
TA貢獻1821條經驗 獲得超6個贊
在代碼中,您從文件中讀取 URL,然后并行觸發所有這些 URL 的請求,然后等待所有并行請求完成。
所以這實際上是有道理的,并不表明存在問題:
如果我將 http.Client 超時更改為 2 秒,它將在 2 秒內完成,如果是 50 秒,它將等到 50 秒,輸入文件是否包含 10 個 url 或 500 個 url 并不重要。
假設您的文件有 500 個 URL。
您并行觸發 500 個請求...然后等待所有請求完成(請記住,它們都是并行執行的)。那需要多長時間?
在最壞的情況下(所有請求都在 50 秒超時),總共只需要 50 秒(因為它們都在并行等待這 50 秒)。
在最好的情況下(所有請求都成功通過且沒有超時),應該需要幾秒鐘。
在一般情況下,您可能會看到(在 50 秒處出現幾次超時),然后需要 50 秒(在最壞的情況下,您將等待這幾個請求并行等待這 50 秒)。
- 1 回答
- 0 關注
- 135 瀏覽
添加回答
舉報
0/150
提交
取消